在我的应用程序中,我经常创建新的 View 和 View 模型,但保留相同的模型。例如,我可能会在主窗口中显示项目列表的简单 View ,并在另一个窗口中显示任何特定项目的更多详细信息。详情窗口可以随时打开和关闭,也可以针对列表中的不同项目同时打开多个窗口。
因此,对于给定的模型对象,可以有多个 ViewModel,它们需要根据其他地方的更改进行更新。 (我在我的模型上使用了 INotifyPropertyChanged
。)我想在使用完 ViewModel 后摆脱它们,即,当详细信息窗口关闭时。
public DetailViewModel(MyDetailModel detailModel)
{
// Retain the Detail Model
this.model = detailModel;
// Handle changes to the Model not coming from this ViewModel
this.model.PropertyChanged += model_PropertyChanged; // Potential leak?
}
据我了解,事件处理程序将导致模型保留对 ViewModel 的引用,并防止它被垃圾收集。
1) 这是正确的吗?我如何判断这些引用是否仍然存在?
2) 我应该如何确定不再需要 ViewModel 并取消订阅事件?
最佳答案
一开始我以为这是要走的路:
public class DetailViewModel : IDisposable
{
public DetailViewModel(MyDetailModel detailModel)
{
// Retain the Detail Model
this.model = detailModel;
// Handle changes to the Model not coming from this ViewModel
this.model.PropertyChanged += model_PropertyChanged; // Potential leak?
}
public void Dispose()
{
this.model.PropertyChanged -= model_PropertyChanged;
}
}
但后来我发现了这个beautiful nugget .因此,至少有两种可能的解决方案:(a) 实现 IDisposable
的示例,以及 (b) 针对 IDisposable
的论据。我会把辩论留给你。 ;)
您也可以考虑 WeakEvent Pattern等等……
关于c# - 当我完成 View 和 ViewModel 而不是 Model 时,如何删除事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7423841/