如何在MVVM中双向同步模型和视图模型

本文关键字:模型 同步 视图 MVVM | 更新日期: 2023-09-27 18:06:15

这是一个简单的问题,我在网上搜索了几个小时也没有成功。

我有一个模型和一个具有一个属性的视图模型。为了使这个属性在视图中可见,我使用了一个视图模型对象,它应该从模型对象自动生成,反之亦然。当然,下面的代码将抛出StackOverflowException,因为模型中的模型对象的更新会导致视图模型中的视图模型对象的更新,从而导致模型中的模型对象的更新,等等…

class ModelObject
{
  ...
}
class ViewModelObject
{
  ...
}
class Model : INotifyPropertyChanged
{
  private ModelObject modelObject = new ModelObject();
  ...
  public ModelObject ModelObject
  {
    get
    {
      return this.modelObject;
    }
    set
    {
      this.modelObject = value;
      this.NotifyPropertyChanged("ModelObject");
    }
  }
}
class ViewModel : INotifyPropertyChanged
{
  private ViewModelObject viewModelObject = new ViewModelObject();
  private Model model = new Model();
  ...
  public ViewModel()
  {
    this.model.PropertyChanged += new PropertyChangedEventHandler(this.propertyChangedEvent);
  }
  public ViewModelObject ViewModelObject
  {
    get
    {
      return this.viewModelObject;
    }
    set
    {
      this.viewModelObject = value;
      this.model.ModelObject = new ModelObject(...);
      this.NotifyPropertyChanged("ViewModelObject");
    }
  }
  private void propertyChangedEvent(object sender, PropertyChangedEventArgs e)
  {
    if (e.PropertyName.Equals("ModelObject"))
    {
      this.ViewModelObject = new ViewModelObject(...);
    }
  }
}

同步这两个对象的常用方法是什么?

如何在MVVM中双向同步模型和视图模型

没有灵丹妙药。由于模型是数据库的表示,而视图模型更接近接口,因此总是需要一些业务逻辑来将模型转换为视图模型,反之亦然。

我通常有两个方法在我的视图模型类- SyncModel(ViewModel viewModel)SyncViewModel(Model model)

还有一个建议-

模型不应该实现INotifyPropertyChanged。视图模型应该在绑定到用户界面时实现这一点。为什么模型需要改变?它表示数据库中的内容。您可以刷新它,但是为什么需要模型的更改通知呢?

编辑:MVVM:绑定到模型,同时保持模型与服务器版本同步

参考。每个类都有对另一个类的引用,侦听属性更改事件并相应地更新自身。

观察者模式-有一个观察者类,每个类注册一个观察者,观察者侦听任何更改并更新所有订阅者。

还有一个可能有用的事件聚合器。

如果想要延迟更新,则需要一个isDirty属性。你更了解你的应用程序,谷歌更多的文章和明智的选择。