Использование области редактирования
В примере UsingEditingScope показано, как пакетировать набор изменений, чтобы их можно было отменить в одной атомарной единице. По умолчанию действия, выполняемые автором конструктора действий, автоматически интегрируются в систему отмены и повтора.
Что демонстрирует
Редактирование области, отмена и повтор.
Обсуждение
В этом образце показано, как организовать набор изменений в дереве ModelItem в рамках одной единицы работы. Обратите внимание, что при привязке к ModelItem значений непосредственно из конструктора WPF изменения вносятся автоматически. В данном образце показано, что следует делать, когда организуемые в пакет изменения производятся посредством императивного кода, а не единичным изменением.
В данном образце добавляются три действия. Когда начинается редактирование, для экземпляра BeginEdit вызывается метод ModelItem. Изменения, внесенные в дерево ModelItem в рамках данной области редактирования, организуются в пакет. Команда BeginEdit возвращает объект EditingScope, с помощью которого можно управлять данным экземпляром. Чтобы зафиксировать или восстановить область редактирования, можно вызвать метод OnComplete или OnRevert.
Кроме того, можно вкладывать друг в друга объекты EditingScope, которые позволяют отслеживать несколько групп изменений как часть более крупной области изменений, и которые можно регулировать вручную. Сценарий, использующий эту возможность, полезен при необходимости по отдельности фиксировать или восстанавливать изменения из нескольких диалогов, которые считаются единичными атомарными операциями. В данном образце области редактирования накапливаются с использованием коллекции ObservableCollection<T> объектов типа ModelEditingScope. Коллекция ObservableCollection<T> используется таким образом, чтобы глубину вложения можно было контролировать через интерфейс конструктора.
Настройка, сборка и выполнение образца
Постройте и запустите образец, после чего модифицируйте рабочий процесс при помощи кнопок слева.
Нажмите кнопку "Открыть область редактирования".
Эта команда вызывает метод BeginEdit, создающий область редактирования и отправляющий ее в стек редактирования.
Затем к выбранному элементу ModelItem добавляются три действия. Стоит заметить, что если область редактирования открывалась не с помощью метода BeginEdit, на полотне конструктора появятся три новых действия. Пока эта операция еще находится в очереди EditingScope, конструктор не обновляется.
Нажмите кнопку "Закрыть область редактирования", чтобы зафиксировать область редактирования. Три действия появятся в конструкторе.