Инструменты пользователя

Инструменты сайта


Боковая панель

developers:tutorial:undoredo

Это старая версия документа.


Отмена и возврат изменений модели

В программном комплексе Топоматик Робур предусмотрена история изменений произошедших во время работы программы с возможностью отмены этих изменений при необходимости.

Классы, используемые для реализации моделей с поддержкой истории изменений расположены в пространстве имён Topomatic.FoundationClasses.Undo.

Для реализации поддержки истории изменений в модели необходимо:

Если необходимо отслеживать изменение значения полей или содержимого списков, то вместо BaseTransactableField<T> и BaseTransactableList<T> нужно использовать TransactableField<T> и TransactableList<T>. Эти классы поддерживают события позволяющие следить за изменением своего содержимого.

Содержащие поля данных, списки и словари объекты должны поддерживать интерфейс ITransactable.

Для совершения изменений модели необходимо выполнить следующую последовательность действий:

  • Вызвать у родительского объекта, в котором происходят изменения, метод BeginUpdate перед началом изменений.
  • Произвести необходимые изменения используя Value у BaseTransactableField<T> или изменив содержимое контейнеров BaseTransactableList<T> и TransactableDictionary<T, U>
  • Вызвать у родительского объекта, в котором происходят изменения, метод EndUpdate после завершения изменений.
При изменении только одного поля BaseTransactableField<T> или одного элемента контейнеров BaseTransactableList<T> и TransactableDictionary<T, U> допустимо не вызывать методы BeginUpdate и EndUpdate. В этом случае они будут вызваны автоматически перед началом и в конце изменения соответственно.

Для работы истории изменений, необходимо чтобы свойству TransactionManager интерфейса ITransactable был назначен корректный экземпляр интерфейса ITransactionManager. Для этого все основные объекты программного комплекса Топоматик Робур наследуются от базового класса UpdatableObject и поддерживают интерфейс IItem.

Если необходимо отслеживать изменение объекта, при изменении каких либо дочерних элементов, то необходимо наследоваться от UndoObject. Это наследник от UpdatableObject в котором дополнительно поддерживаются события Changed и Undo

Класс UpdatableObject отвечает за реализацию интерфейса ITransactable, а интерфейс и IItem позволяет реализовать свойство TransactionManager запрашивая его по цепочке родителей с самого верхнего. В этом случае экземпляр TransactionManager назначается самому верхнему элементу в цепочке, обычно это наследник от StateControllerObject, а все дочерние элементы получают его автоматически.

Часто возникает ситуация, когда в модель необходимо внести какие либо изменения, а потом либо отменить внесенные изменения без записи в истории либо применить их. В таких случаях перед началом изменений нужно вызвать метод BeginTransaction а в конце в либо метод Commit чтобы применить изменения, либо метод Rollback для сброса изменений
developers/tutorial/undoredo.1553422282.txt.gz · Последние изменения: 2021/07/22 14:28 (внешнее изменение)