我正在开发一个Silverlight LoB应用程序,设计人员希望有一个标签界面,类似于Visual Studio的界面(我们可能会使用Telerik Rad控件作为对接标签)。完成原型之后,界面运行良好,但我在考虑如何在MVVM项目中实现撤销/重做功能时遇到问题。如何在MVVM应用程序中实现撤销/重做?
撤消/恢复功能有:
- 上的撤消/重做,UI状态,即 返回焦点,选择等恢复到 控制(一个或多个)(例如一个文本框) 这个变化源于。
- 拥有按次撤销/重做堆栈
通常情况下,我会用命令的模式,但我不知道如何应用与MVVM。
我已经使用了命令&绑定来获得理想化的视图模型的松散耦合,但它使撤销/重做变得更加棘手,因为视图模型没有任何视图的概念以及接收到命令或绑定属性发生变化时的视图状态。似乎我需要某种服务跟踪,无论何时用户执行一些可撤销操作并获取状态以供以后恢复时,该视图都处于活动状态。
对于在MVVM中实现撤消/重做的最佳实践有什么共识吗?我非常关心丹尼尔沃恩如何在他的钙项目中做到这一点; Blend显然是使用MVVM模式编写的,它的行为与我想要的应用程序一样,如果MS解释他们是如何做到的,那就太棒了!
我现在也将根据你提到的调查钙项目。感谢那。 – 2010-08-25 18:02:44
感谢您的回答,HiTech。当你说“撤销仅在单个控件中”时,你的意思是,例如,在一个带有几个文本框的窗体(视图)上,用户必须关注一个文本框,在该文本框中为他进行更改以撤销/重做他通过TextBox所做的任何更改?将操作与接口完全分开 - 是否意味着禁止视图中的控件与视图模型中的属性之间的双向绑定?不幸的是,我们的应用程序具有交互式绘图表面(画布)和Blend/VS等形式;这很复杂。 绝对感谢您的想法! – JamesCo 2010-08-26 13:26:56