在ViewModel中解除事件处理程序的正确方法是什么

时间:2015-11-03 17:18:11

标签: c# events mvvm eventhandler

所以我一直在研究从视图模型中正确解开事件处理程序以防止内存泄漏。

说我有一个查看模型,如下所示:

user_posts

现在我最初发现This link表示实施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 } } 并添加IDisposable方法:

Dispose

但是当我想到的时候,这并没有被调用。它似乎不稳定,有时甚至根本不打电话?因此,我决定搜索“何时调用处理”,这导致我this link解释public void Dispose() { foreach (var obj in MyObjects) { obj.MySampleEvent -= Obj_MySampleEvent; } } / Dispose

调用Finaliser

让我参与最后一项研究的是,我记得有人说Destructor中没有解开事件处理程序,因为它永远不会被this link调用。

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

我可能建议转换为ObservableCollection,因为ViewModel需要绑定一些东西。然后,您可以直接在ViewModel属性上订阅任何事件,这将允许您在该事件内订阅Window_Closing和cleanup。

class MyViewModel
{
    private ObservableCollection<MyObject> _myObjects;

    public ObservableCollection<MyObject> MyObjects
    {
        get { return _myObjects; }
        set { _myObjects = value; }
    }

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