2011-03-30 89 views
6

继MVVM模式之后,我试图通过View来响应来自View Model的请求来连接子窗口的显示。这种编码风格是否会导致内存泄漏

使用MVVM光强Messenger中的视图将注册为要求在View的构造函数,以便显示子窗口:

InitializeComponent(); 
Messenger.Default.Register<EditorInfo>(this, (editorData) => 
{ 
    ChildWindow editWindow = new EditWindow(); 
    editWindow.Closed += (s, args) => 
    { 
     if (editWindow.DialogResult == true) 
      // Send data back to VM 
     else 
      // Send 'Cancel' back to VM 
    }; 

    editWindow.Show(); 
}); 

是否订阅使用Lambda原因问题ChildWindow Closed事件为垃圾收集。或者换句话说,当(如果有的话)editWindow会变成未被引用的,所以垃圾收集的候选人。

回答

4

editWindow将保持对它的引用this,但没有将不得不editWindow的引用,所以它最终会被垃圾收集,并参考this将被丢弃。因此,它应该不会造成任何内存泄漏......

如果你想确保不会有任何问题,可以从事件退订:

InitializeComponent(); 
Messenger.Default.Register<EditorInfo>(this, (editorData) => 
{ 
    ChildWindow editWindow = new EditWindow(); 
    EventHandler handler = (s, args) => 
    { 
     editWindow.Closed -= handler; 
     if (editWindow.DialogResult == true) 
      // Send data back to VM 
     else 
      // Send 'Cancel' back to VM 
    }; 

    editWindow.Closed += handler; 

    editWindow.Show(); 
}); 
相关问题