gpt4 book ai didi

c# - 如何在 MVVM 中双向同步模型和 View 模型?

转载 作者:行者123 更新时间:2023-12-03 10:13:32 24 4
gpt4 key购买 nike

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

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

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(...);
}
}
}

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

最佳答案

没有银弹。由于模型是数据库的表示,而 View 模型更接近接口(interface),因此总是需要一些业务逻辑来将模型转换为 View 模型,反之亦然。

我的 View 模型类中通常有两种方法 - SyncModel(ViewModel viewModel)SyncViewModel(Model model)
还有一个建议——

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

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

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

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

还有一个event aggregator这可能有用。

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

关于c# - 如何在 MVVM 中双向同步模型和 View 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15687415/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com