首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用EF和MVVM从UI截取属性更新的更好方法

使用EF和MVVM从UI截取属性更新的更好方法
EN

Stack Overflow用户
提问于 2012-07-13 09:48:38
回答 2查看 611关注 0票数 0

我有一个具有撤销-重做功能的WPF应用程序。我使用EF与数据库进行交互。

我想知道当UI更改某些属性时,是否有更好的方法或模式需要通知。

下面是我目前使用的方法:

  • 让EF生成类。例如: 公共部分类页: IObjectWithChangeTracker,INotifyPropertyChanged { #region基元属性DataMember公共字符串标题{ get {返回_title;} set { if (_title = value) { _title = value;OnPropertyChanged(" title ");}}私有字符串_title;.
  • 然后,在类的非生成部分中,为UI添加另一个属性。在这种情况下,属性绑定到WPF TextBox: 公共部分类页{ ((INotifyPropertyChanged)this).PropertyChanged += Page_PropertyChanged;} void Page_PropertyChanged(对象发送方,PropertyChangedEventArgs e) { switch (e.PropertyName) { case "title":OnPropertyChanged(" titleUI ");}公共字符串titleUI{ get {返回标题;} set { if (值==标题)返回;string oldValue = title;UndoRedo.PushAtomic( () => title = oldValue,() => title = value,"change page title");}.

为了这个目的,我曾经听过FrameworkElement.SourceUpdated,但我放弃了这种方法,更密切地遵循MVVM设计模式。

有没有更好或更简单的方法?

编辑:我不直接将TextBox绑定到title属性是因为我不想在属性被TextBox以外的其他东西更新时添加到undo-redo堆栈中。另外,当EF ObjectContext实现实体时,这些值由设置器分配,我也不想将其添加到撤销-重做堆栈中。

编辑2:对于这个问题,我已经放弃了。如果可以的话我会删掉的。例如,我无法理解关于我的代码不是真的评论,MVVM与手头的问题有什么关系。无论我是否使实体类与所谓的ViewModel类严格分离,我仍然需要找到一种方法来“拦截”UI中的更新。我投票决定关门。如果你觉得这不会有什么进展的话,请做同样的事。

EN

回答 2

Stack Overflow用户

发布于 2012-07-13 10:35:59

wpf文本框有一个内置的撤销/重做-因此,如果您只是将您的viewmodel属性绑定到mode=twoway,您的视图和视图总是同步的,并且您的textbox处理重做撤消。我错过了什么吗?

票数 1
EN

Stack Overflow用户

发布于 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堆栈上添加一个标志,告诉它在物化对象时忽略任何属性更改?

必须在部分实体类中重写一些方法,以告诉堆栈绕过任何撤销/重做信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11468059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档