MVVM Light和Undo / Redo?

时间:2010-08-31 09:55:26

标签: c# wpf design-patterns mvvm-light

我可能在这里混淆了一些责任(甚至可能是术语),但我无法完全理解这一点。

命令模式和MVVM Light中的命令之间是否有任何关系(因此在WPF中也是如此)?我真的很想实现某种撤销/重做机制,但是无法弄清楚是否存在“MVVM Light方式”。

如果这与MVVM Light无关,那么如何通过不对抗MVVM Light WPF来实现“原始”中的撤销/重做命令?

3 个答案:

答案 0 :(得分:5)

MVVM Light和WPF中的命令通常是一种在单个对象和接口中封装任意功能集的方法,并连接任意数量的UI元素以执行该操作。

这些命令可以合并到撤消/重做功能的命令模式实现中,但还需要更多。

您可以滚动自己的命令堆栈,这是我在当前WPF项目中使用的路径(使用Prism)。

基本上,这是心态的转变,用户可以通过UI进行的每次更改

  1. 包含在命令
  2. 有相应的撤消命令
  3. 被推入堆栈
  4. 还有一些开源项目可以帮助解决这个问题,包括http://undo.codeplex.com/,这是Visual Studio团队成员Kirill Osenkov的副项目。

答案 1 :(得分:2)

我为WPF应用程序实现了undo / redo,并将我的undo / redo代码发布到http://muf.codeplex.com/

我考虑过尝试使用Command模式封装逻辑的推荐方法。它在纸面上似乎很好,但在我的情况下,弄清楚如何将每个动作放入一个可以可靠地撤消/重做一组更改的命令似乎非常具有挑战性。相反,我采用“监视”底层模型的方法进行更改,然后将这些更改存储在撤消堆栈中。这有点像命令模式,但采用“自下而上”的方法。由于更改模型,撤消操作“失效”。

通过拦截模型的setter中的更改来收集操作,将它们存储到一个更改单元中,代理用于撤消/重做更改,然后将其放在一堆更改中。 MUF库包括管理堆栈,创建变更单元等的逻辑。

欢迎在codeplex网站(http://muf.codeplex.com/)上提出意见和问题。您还可以在那里找到完整的文档和示例应用程序。

你也可以通过NuGet获得它。只需寻找“MUF”或“Monitored Undo Framework”。它包括对Silverlight 4.0以及.NET 3.5,4.0和WP7的支持。

答案 2 :(得分:1)

我不知道MVVM或WPF中任何固有的撤销/重做功能,我担心。

MVVM Light是一个非常好的轻量级工具包,仅用于快速实现MVVM。您将不得不自己实施的任何其他模式。