【发布时间】:2018-06-30 11:32:44
【问题描述】:
我需要更新 ViewModel,当 Model 改变和 Model,当 ViewModel 改变。就我而言,我有:ProjectViewModel 实现 INotifyPropertyChanged 和 Project(model) 实现 INotifyPropertyChanged。当 ViewModel 更改时,我只需直接更改 Model。但是当模型改变时,那又如何呢?我试图在 ViewModel 中处理 Model 的属性更改事件。但是我会从 long-live 模型中得到强引用,这会导致内存泄漏,或者不会?如果是的话,不然怎么办?
编辑:
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) 属性设为 public 并直接绑定?
【问题讨论】:
-
请添加你有的代码,这样更容易理解
-
造成内存泄漏很难说,但如果对象及其引用仍然被引用,则不会被垃圾回收。我会重新考虑您的方法:如果 ViewModel 与它所代表的模型一样长,那么它的目的是否纯粹是为了 UI 目的而精简模型?在这种情况下,(a) 模型是否足够或 (b) 是否存在将您的 ViewModel 映射回您的模型的点 - 然后充当 DTO?
-
@Gigabyte 我需要视图模型,因为将来它将包含与 UI 相关的内容(支持重命名等)。我将它用于 UI。并且模型可以从其他对象更新。它将包含用于保存的逻辑,可能还有更多内容。