DataGrid и MVVM с Undo / Redo - PullRequest
       14

DataGrid и MVVM с Undo / Redo

1 голос
/ 02 ноября 2011

Я играю с довольно простым интерфейсом с кнопками и ярлыками для добавления, вставки и удаления строк сетки данных (базовая коллекция границ).Также необходимо реализовать стек отмены.Но ... я понятия не имею, как поступить с внутренней логикой этого контроля.По умолчанию DataGrid может автоматически удалять или добавлять новую строку и выполняет многие другие действия при вводе пользователем (Esc, F2 и т. Д.), Тем самым неявно изменяя связанные данные.

Поскольку команды должны выполняться на стороне виртуальной машины, отменаСтек является его (или даже М) бизнесом, но DataGrid содержит внутренне предопределенные привязки к DataGrid.команды.И я не вижу простого способа «наблюдать» за изменениями в данных.

Мое понимание идеального потока MVVM таково: действие пользователя (представление) -> команда (ВМ) -> исключение команды + отменастековые операции.(VM-M) -> Изменения пользовательского интерфейса соответственно изменениям виртуальной машины.

Я в замешательстве и нуждаюсь в хороших советах относительно реализации.

Ответы [ 4 ]

2 голосов
/ 02 ноября 2011

2 Способы пойти по этому поводу:

  1. Используйте всю свою логику в ViewModel (модели POCO).

    Вам нужно, чтобы ваш ViewModel содержал стек Undo / Redo. Как вы реализуете это зависит от вас, но я бы посоветовал, чтобы стеки отмены и повторения были Tuple<String, Object>. Сохраните имя свойства и значение свойства. Это проще, чем управлять клонами. Это также дает вам возможность проверить "грязность" бедного человека, посмотрев, есть ли на UndoStack какие-либо предметы.

  2. Предоставьте вашим моделям некоторые интерфейсы, такие как IUndoRedo (Rich Models).

    Вам понадобятся методы интерфейса вызова ViewModels для отмены / повтора, но идея та же самая ... есть стек отмены / повтора, состоящий из Tuple<String, Object>.

    Если вы решите использовать богатый модельный подход, вы можете взглянуть на существующие фреймворки, такие как CSLA.Net , созданный для богатых моделей, хотя это может быть немного больше, чем что вам действительно нужно. Просто добавьте его на тот случай, если вы хотите иметь действительно богатые модели.


Дополнительное примечание: вы ObservableCollection (ItemsSource) должны иметь видовые модели, а не модели. Просто добавьте это на тот случай, если вы используете Модели. То есть, не делайте ObservableCollection<IEmployee>, а скорее ObservableCollection<EmployeeViewModel>. Это делает вещи проще, намного проще и удобнее!

Еще одно замечание: старайтесь избегать DataGrid. Это заставляет разработчиков рвать на себе волосы. Я бы просто развернул вашу собственную "сетку" с ListView:)

1 голос
/ 03 ноября 2011

Я написал статью об отмене / восстановлении в MVVM. Он разделен на две части: первая объясняет отмену / повтор в общих выпусках, а вторая объясняет работу со списками:

Часть 1. Использование шаблона Viewmodel для обеспечения отмены / повтора в WPF

Часть 2. Просмотр списков моделей

Поток: Действие пользователя (Просмотр) -> Команда (ВМ) -> При выполнении команды изменяется Модель -> Модель уведомляет об изменениях ВМ -> ВМ уведомляет об изменениях в представлении. Таким образом, если модель изменена из другого источника, она также обновит представление.

Существует также проект github здесь .

1 голос
/ 02 ноября 2011

Обычно я строю логику отмены в самих моделях. Сделайте так, чтобы они работали так, как вы хотите, прежде чем вы начнете думать о том, как они будут связаны с пользовательским интерфейсом.

0 голосов
/ 02 ноября 2011

Поскольку ваша DataGrid привязана к коллекции, вы можете отслеживать изменения в самой коллекции, а не в DataGrid. Используйте событие CollectionChanged в вашей коллекции, чтобы отслеживать добавленные или удаленные элементы, и зарегистрируйте событие PropertyChanged для всех элементов вашей коллекции для отслеживания изменений.

Альтернативной идеей также может быть предоставление команды RevertChanges вместо UndoChanges. Его гораздо проще реализовать, потому что вам нужно только сохранить исходную коллекцию, чтобы вы могли восстановить ее при необходимости.

...