[英]MVVM update view model when model changes
当模型更改时,我需要更新ViewModel;在ViewModel更改时,我需要更新Model。 就我而言,我有:ProjectViewModel实施INotifyPropertyChanged的和项目 (模型)执行INotifyPropertyChanged的 。 当ViewModel更改时,我只是直接更改Model。 但是,当Model更改时,该怎么办? 我试图在ViewModel中处理Model的属性更改事件。 但是,我将获得长期模型的强大参考,这是否会导致内存泄漏? 如果是,那么该怎么做?
编辑:
class ProjectViewModel : INotifyPropertyChanged
{
private Project Project;
public string Name
{
get
{
return Project.Name;
}
set
{
Project.Name = value;
OnPropertyChanged("Name");
}
}
public ProjectViewModel(Project project)
{
this.Project = project;
project.PropertyChanged += OnProjectChanged;
}
private void OnProjectChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "Name")
OnPropertyChanged("Name");
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
} //and then things for UI....
}
class Project : INotifyPropertyChanged
{
private string name;
public string Name
{
get
{
return name;
}
set
{
name = value;
OnPropertyChanged("Name");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}//and then logic (for saving)
}
EDIT2:还是可以在ViewModel中实现IDisposable之类的东西? 还是将ViewModel中的model(Project)属性设为公开并直接绑定?
如果您的VM以任何方式取决于模型中属性的值,则是,您将需要订阅其INPC通知。 但是现实是,通常,VM不需要了解特定的模型值,除非它正在汇总值(即,将对象列表中的值相加)。
当您确实需要订阅模型的INPC时,您还需要退订。 这并不像看起来那样麻烦,因为VM触发了模型的获取或重新获取,因此很清楚何时需要完成退订。 检查INotifyCollectionChanged接口-这是开始订阅和取消订阅的好地方。
就个人而言,我将按照您在第二次编辑中的建议进行操作,在Model上实现INotifyPropertyChanged
,将Project
为公共属性,并直接绑定到Project.Name
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.