我有一个具有撤销-重做功能的WPF应用程序。我使用EF与数据库进行交互。
我想知道当UI更改某些属性时,是否有更好的方法或模式需要通知。
下面是我目前使用的方法:
为了这个目的,我曾经听过FrameworkElement.SourceUpdated,但我放弃了这种方法,更密切地遵循MVVM设计模式。
有没有更好或更简单的方法?
编辑:我不直接将TextBox绑定到title属性是因为我不想在属性被TextBox以外的其他东西更新时添加到undo-redo堆栈中。另外,当EF ObjectContext实现实体时,这些值由设置器分配,我也不想将其添加到撤销-重做堆栈中。
编辑2:对于这个问题,我已经放弃了。如果可以的话我会删掉的。例如,我无法理解关于我的代码不是真的评论,MVVM与手头的问题有什么关系。无论我是否使实体类与所谓的ViewModel类严格分离,我仍然需要找到一种方法来“拦截”UI中的更新。我投票决定关门。如果你觉得这不会有什么进展的话,请做同样的事。
发布于 2012-07-13 10:35:59
wpf文本框有一个内置的撤销/重做-因此,如果您只是将您的viewmodel属性绑定到mode=twoway,您的视图和视图总是同步的,并且您的textbox处理重做撤消。我错过了什么吗?
发布于 2012-07-13 10:05:35
不完全是你想要的答案,但我会看一些类似于团结的东西:
http://blogs.msdn.com/b/agile/archive/2011/03/21/interception-in-silverlight-demo.aspx
这是一个银光帖子(但它也工作在WPF等)。基本上,您可以为模型创建一个拦截器,并将代码注入属性getter/setter。这样,您就可以调用N级撤销/重做处理代码,而不必重新实现属性。
不过,您所做的看起来更像是一个丰富的模型,而不是一个视图模型,因为标准的视图模型将封装该模型。
我不想为模型上的每个属性编写额外的属性getter/setter代码
(他们展示了一个虚拟方法拦截器,但是可以使用一个实例拦截器,我认为这是可行的,但是要听取他们关于拦截器的观点和他们‘监听’的范围)
编辑:
很抱歉没有真正回答这个问题
以下是一些建议:
我不确定EF是否让我们从基类派生实体类,但这是一回事-您只需将PropertyChanged事件挂在基类中并相应处理。您可以在基础上保留一个Dictionary<string, object>来跟踪“旧”值并处理撤消操作。
我理解EF实现对象的一点--您能不能在UndoRedo堆栈上添加一个标志,告诉它在物化对象时忽略任何属性更改?
必须在部分实体类中重写一些方法,以告诉堆栈绕过任何撤销/重做信息。
https://stackoverflow.com/questions/11468059
复制相似问题