【问题标题】:How to synchronize Model and View Model bidirectional in MVVM?如何在 MVVM 中双向同步模型和视图模型?
【发布时间】:2013-03-19 05:17:04
【问题描述】:

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

我有一个模型和一个具有一个属性的视图模型。为了使这个属性在视图中可见,我使用了一个应该从模型对象自动生成的视图模型对象,反之亦然。当然,下面的代码会抛出 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 中同步视图模型和模型是基本的。在不同的情况下,我需要永久使用这种行为。

标签: c# mvvm view model synchronize


【解决方案1】:

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

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

还有一个建议 -

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

编辑:MVVM: Binding to Model while keeping Model in sync with a server version

硬参考。每个类都引用另一个类,监听属性更改事件并相应地更新自己。

观察者模式 - 有一个观察者类,每个类都向观察者注册自己,观察者监听任何变化并更新其所有订阅者。

还有一个event aggregator 可能有用。

如果您想要延迟更新,则需要 isDirty 属性。您更了解您的应用程序,请在 Google 上搜索更多文章并明智地选择。

【讨论】:

  • 我的示例中的模型不是数据库的表示 - 它是内存中的一个简单模型。因此,模型也可以通过另一个视图模型进行更改,例如,应该通知上面的视图模型以触发 INotifyPropertyChanged-Event,这将导致界面刷新。
  • 感谢您的回答。我会这样尝试的!
猜你喜欢
  • 1970-01-01
  • 2015-06-14
  • 2010-12-07
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多