c# - 在 ViewModel 中取消 Hook 事件处理程序的正确方法是什么

标签 c# events mvvm eventhandler

因此,我一直在研究如何从我的 View 模型中正确取消事件处理程序,以防止内存泄漏。

假设我有一个 查看型号 像这样:

class MyViewModel
{
    private List<MyObject> _myObjects;
    public List<MyObject> MyObjects
    {
        get { return _myObjects; }
        set { _myObjects = value; }
    }

    public MyViewModel()
    {
        for (int i = 0; i < 10; i++)
        {
            var obj = new MyObject();
            obj.MySampleEvent += Obj_MySampleEvent ;
        }
    }

    private void Obj_MySampleEvent (object sender, EventArgs e)
    {
        //do something
    }
}

现在最初我发现This link其中说实现IDisposable并添加 Dispose方法:
public void Dispose()
{
   foreach (var obj in MyObjects)
   {
       obj.MySampleEvent -= Obj_MySampleEvent;
   }
}

但是当我想到时,这并没有被调用。它似乎是不稳定的,有时甚至根本没有打电话?所以我决定搜索“何时调用 dispose”,这导致我找到 this link解释 DisposeFinaliser 调用/Destructor
引导我进行最后一项研究的原因是,我记得有人说不要在 Destructor 中取消 Hook 事件处理程序。因为它永远不会被调用,来自 this link .

所以我只是想最后澄清一下。在 ViewModel 中解开事件处理程序的正确方法是什么?

最佳答案

我通常在导航期间在我的 View 模型上取消注册事件处理程序。

例如,当引发 OnNavigatedFrom 事件(在您的 View 上)时,您可以取消注册当前 View 模型上的事件处理程序。然后,当引发 OnNavigatedTo 事件时,您可以重新注册事件处理程序。

关于 IDisposable,我不确定。
我认为 IDisposable 是用于管理资源而不是业务逻辑。

关于c# - 在 ViewModel 中取消 Hook 事件处理程序的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33505291/

相关文章:

c# - 静态方法中的全局变量

events - UPnP 订阅续订在设备上失败

javascript - 如何捕获控制字符的击键

c# - 自定义搜索组合框

wpf - MvvmCross:在另一个 View 中查看(或等效于CaliburnMicro Conductor)

wpf - prism5 regionManager.RequestNavigate 显示 System.object

C# 分配给公共(public)类和列表中的字符串

c# - LINQ: 'Select c' 和 'Select new (c...' 之间的区别

c# - Bing API 图像搜索过滤器

Java 自定义事件处理程序和监听器