2011-03-30 102 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(); 
});