这是一个简单的问题,我在互联网上搜索了几个小时没有成功......
我有一个模型和一个属性的视图模型。为了在视图中查看此属性,我使用了一个view-model-object,它应该从model-object自动生成,反之亦然。当然,以下代码将抛出StackOverflowException,因为更新模型中的模型对象会导致视图模型中的view-model-object更新,这会导致模型中对象的更新等等...
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(...);
}
}
}
同步这两个对象的常用方法是什么?
答案 0 :(得分:4)
没有银弹。由于model是数据库的表示,viewmodel更接近接口,因此总是需要一些业务逻辑将模型转换为视图模型,反之亦然。
我的视图模型类中通常有两种方法 - SyncModel(ViewModel viewModel)
和SyncViewModel(Model model)
还有一个建议 -
模型不应实现INotifyPropertyChanged。视图模型应该将其实现为绑定到用户界面。为什么模型需要改变?它代表了数据库中的最新情况。您可以刷新它,但为什么需要更改模型的通知?
修改:MVVM: Binding to Model while keeping Model in sync with a server version
硬参考。每个类都引用另一个类,监听属性更改事件并相应地更新自身。
观察者模式 - 拥有一个观察者类,每个类都使用观察者注册自己,观察者监听任何更改并更新其所有订阅者。
还有event aggregator可能有用。
如果您想要延迟更新,则需要isDirty属性。您更了解您的应用程序,谷歌搜索更多文章并明智地选择。