c# - 当我完成 View 和 ViewModel 而不是 Model 时,如何删除事件处理程序

标签 c# .net events mvvm garbage-collection

在我的应用程序中,我经常创建新的 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/

相关文章:

c++ - 如何在线程完成工作时触发事件

c# - request.GetRequestStream() 抛出 “Value cannot be null” 异常

c# - RichTextBox 控件,制作非 URL 超链接?

javascript - jQuery window.on resize 没有在正确的时间触发

c# - Application.DoEvents() 仅适用于 WinForms 吗?

c# - 从 ref 变量解构元组

javascript - 更改 URL 片段后操纵浏览器行为

c# - 如何为 Winforms RichTextBox 设置交替的线条颜色?

c# - 内存中烧录System.String

c# - 如何创建日历事件。带有预填收件人电子邮件的 ics?