2011-07-26 95 views
0

如何確保我的子窗口在關閉時被卸載?關閉時卸載子窗口(silverlight mvvm)

我打開我的viewmodel中的子窗口,但是在它關閉之後,它仍然會像comboboxes上的selectedchanged事件觸發。

子窗口使用與它被調用相同的viewmodel,所以我想這解釋了爲什麼這些事件正在被解僱。 itemssources仍然有效。

但是當它關​​閉時,我想「處理」好子窗口。

我試圖加封閉處理程序是這樣的(默認視圖代碼後面):

private void OnLaunchEditItem(ItemMessage msg) 
    { 
     var editWnd = new EditItemWindow(); 
     editWnd.Closed += new EventHandler(editWnd_Closed); 
     editWnd.Show(); 
    } 

    void editWnd_Closed(object sender, EventArgs e) 
    { 
     sender = null; 
    } 

沒有sucesss ..

所以我現在正在做的是從刪除的ItemsSource子窗口控制,這在我看來......不是解決問題的理想方案。關閉時必須從內存中處理掉所有內容? (Childwindow 「查看」 代碼隱藏)視圖之間

private void OKButton_Click(object sender, RoutedEventArgs e) 
    { 
     this.DialogResult = true; 
     combobox1.ItemsSource = null; 
     combobox2.ItemsSource = null; 
    } 

    private void CancelButton_Click(object sender, RoutedEventArgs e) 
    { 
     this.DialogResult = false; 
     combobox1.ItemsSource = null; 
     combobox2.ItemsSource = null; 
    } 
+0

http://stackoverflow.com/questions/7036873/when-to-dispose-viewmodel-in-mvvm-light – Kman

回答

1

消息傳遞有一個已知的問題,它引入了消息的使者和接收者之間的硬鏈接。因此,如果您使用消息傳遞,則必須確保調用Messenger.Unregister方法。換句話說,當您致電Register來處理一個消息時,請確保您也撥打Unregister以及

所以在你看來,你必須註冊Unloaded事件;那麼你打電話給Messenger.Unregiser(this);這是你的觀點。

在ViewModels中,您必須確保調用Cleanup方法註銷ViewModel作爲消息接收者。

另見:

MVVM Light Listener not releasing/deterministic finalization for registered object?MVVM Light Messenger executing multiple times

Laurent意識到這個問題,但是 - 至今 - 沒有解決方案。

0
  1. 共享的ViewModels會導致這樣的問題。這就是爲什麼它很少完成。
  2. 一個ViewModel通常不應該關心導航,因爲在理想的世界裏,它甚至不應該知道它會綁定到什麼樣的視圖。這包括spawing子視圖(ChildWindows)。

我會向您推薦兩項更改。第一個是爲你的對話框創建一個專用的視圖模型。其次,通過將導航委託給Controller來將導航與視圖模型分離。 MVVM中的控制器通常是一個單一對象,其目的是打開窗口,對話框等。這可以通過Event Aggregator模式以一種非常優雅的方式實現。

+0

視圖模型不能「察覺」子窗口,因爲它發送的mvvmlight消息被拾取由默認視圖。在這個視圖中,上面的代碼取自(打開子窗口)。以上所有代碼均來自視圖代碼隱藏,而不是視圖模型。但默認視圖和子窗口「視圖」鏈接到相同的視圖模型共享「selecteditem」。 – Kman

+0

To Oliver Weichhold:從經驗來看......這樣的行爲通常表明消息傳遞出錯了,即沒有取消註冊消息處理程序。這是MVVM-Light的**已知**行爲。對Oliver Weichhold和@Kman看到我的答案。 – AxelEckenberger