我有一个具有撤消重做功能的 WPF 应用程序。我使用 EF 与数据库进行交互。
我想知道当 UI 更改某些属性时是否有更好的方法或模式来通知。
这是我目前使用的方法:
让 EF 生成类。例如:
public partial class Page: IObjectWithChangeTracker, INotifyPropertyChanged { #region Primitive Properties [DataMember] public string title { get { return _title; } set { if (_title != value) { _title = value; OnPropertyChanged("title"); } } } private string _title; ...
然后在类的非生成部分,我为 UI 添加另一个属性。在这种特殊情况下,该属性绑定到 WPF 文本框:
public partial class Page { public Page() { ((INotifyPropertyChanged)this).PropertyChanged += Page_PropertyChanged; } void Page_PropertyChanged(object sender, PropertyChangedEventArgs e) { switch (e.PropertyName) { case "title": OnPropertyChanged("titleUI"); break; } } public string titleUI { get { return title; } set { if (value == title) return; string oldValue = title; title = value; UndoRedo.PushAtomic( () => title = oldValue, () => title = value, "change page title"); } } ...
为此,我曾经听过 FrameworkElement.SourceUpdated,但我放弃了这种方法来更紧密地遵循 MVVM 设计模式。
有没有更好或更简单的方法?
编辑:我不直接将TextBox绑定到title
属性的原因是我不想在属性被TextBox以外的其他东西更新时添加到撤消重做堆栈。此外,当 EF ObjectContext 实现实体时,值由设置器分配,我也不想将其添加到撤消重做堆栈中。
编辑2:对于这个问题,我有点放弃了。如果可以,我会删除它。例如,我无法理解关于我的代码不是真正的 MVVM 的评论与手头的问题有什么关系。无论我是否将实体类与所谓的 ViewModel 类严格分开,我仍然必须找到一种方法来“拦截”来自 UI 的更新。我投票关闭。如果你和我一样觉得这无济于事,请做同样的事情。