1

我正在使用非常简单的界面,其中包含用于添加、插入和删除数据网格行(底层绑定集合)的按钮和快捷方式。还需要实现撤消堆栈。但是......我不知道如何处理这个控件的内部逻辑。默认情况下,DataGrid 可以自动删除或添加新行,并对用户输入(Esc、F2 等)执行许多其他操作,从而隐式更改绑定数据。

由于命令将在 VM 端执行,撤消堆栈也是它的(甚至是 M 的)业务,但 DataGrid 包含内部预定义的 DataGrid 绑定。命令。而且我认为“观察”数据的变化并不容易。

我对理想的 MVVM 流程的理解是这样的:用户操作(视图)-> 命令(VM)-> 命令执行 + 撤消堆栈操作。(VM-M) -> UI 分别更改为 VM 更改。

我很困惑,需要一些关于实施的好建议。

4

4 回答 4

3

2 解决方法:

  1. 将所有逻辑都放在 ViewModel(POCO 模型)上。

    你必须让你的 ViewModel 包含一个 Undo/Redo 堆栈。您如何实现它取决于您,但我建议您将 Undo/Redo 堆栈设置为Tuple<String, Object>. 存储属性名称和属性值。这比管理克隆更容易。它还使您能够通过查看 UndoStack 上是否有任何项目来进行穷人“肮脏”检查。

  2. 给你的模型一些接口,比如 IUndoRedo (Rich Models)。

    您必须让 ViewModels 调用接口方法来撤消/重做,但想法是一样的......有一个撤消/重做堆栈,由Tuple<String, Object>.

    如果您确实决定想要使用丰富的模型方法,您可以查看现有的框架,例如为丰富模型制作的CSLA.Net,尽管它可能比您真正需要的要多一些。如果您想拥有非常丰富的模型,只需将其扔掉即可。


附注:您的 ObservableCollection (ItemsSource) 应该属于 ViewModel,而不是 Model。只是把它扔在那里,以防你使用模型。也就是说,不要做ObservableCollection<IEmployee>,而是要ObservableCollection<EmployeeViewModel>。它使事情变得更容易、更容易和更可重用!

另一个注意事项:尽量避免使用 DataGrid。它让开发人员想扯掉他们的头发。我只是用 ListView 推出你自己的“网格”:)

于 2011-11-02T18:10:26.713 回答
1

我写过一篇关于 MVVM 中撤消/重做的文章。它分为两部分:第一部分解释通用版本中的撤消/重做,第二部分解释使用列表:

第 1 部分:使用 Viewmodel 模式在 WPF 中提供 Undo / Redo

第 2 部分:视图建模列表

流程为:用户操作(视图)->命令(VM)->命令执行修改模型->模型通知VM更改->VM通知视图更改。这样,如果模型是从其他来源修改的,它也会刷新视图。

这里还有一个 github 项目。

于 2011-11-03T10:31:28.287 回答
1

通常我将撤消逻辑构建到模型本身中。在您开始考虑如何将它们绑定到 UI 之前,让它们完全按照您想要的方式工作。

于 2011-11-02T17:41:47.767 回答
0

由于您的 DataGrid 绑定到一个集合,因此您可以监视集合本身而不是 DataGrid 的更改。使用CollectionChanged收藏中的事件来监视添加或删除的项目,并PropertyChanged在收藏的所有项目上注册事件以监视编辑。

另一种想法是提供RevertChanges命令而不是UndoChanges. 它的实现要简单得多,因为您只需要存储原始集合,以便在需要时恢复它。

于 2011-11-02T17:40:56.743 回答