2012-10-29 75 views
0

我們有一個啓動子窗口的主窗口。該子窗口動態加載自定義的用戶控件。在這些用戶控件的構造器中,我傳遞了一個主對象,該對象從此主對象中生成一個用戶控件特定的視圖模型並將其指定爲其數據上下文。如何在父窗口關閉時處理動態加載的usercontrols/viewmodels

所有這一切都工作得很好。但是,我jst發現,當我關閉子窗口時,至少我的一些自定義用戶控件仍然處於活動狀態。我應該如何清理我的控件/視圖模型?在主窗口關閉之前似乎沒有任何東西被調用。沒有析構函數,沒有Dispatcher.ShutdownStarted,沒有可用的處理,沒有關閉事件,我找不到任何東西。

任何人都知道在窗戶關閉後應該做些什麼來正確清理?

+0

你怎麼知道你的控件仍然活躍的一些想法? –

回答

0

我相信你需要考慮精確什麼是負責創建你的意見和你的ViewModels,什麼是負責確定是否不是可以關閉與否等

它通常是一個好主意因爲無論什麼創造東西來摧毀它。因此,如果您的子窗口正在創建自定義用戶控件,它可能應該負責將其刪除。不過,我相信如果你的對象都沒有引用(或強大的事件訂閱),它應該最終被垃圾收集。您可以實現一個終結器/析構函數,並將Output.String輸出到輸出窗口,以查看最終可能發生的時間。一個好的內存分析器也可能是一個好主意。但是,您也可能需要更精確地控制ViewModel何時關閉。

很難確切地說出您的情況會發生什麼,因爲它確實取決於您的確切和特定的設置。讓我向你描述一下我的應用程序中的場景。我有幾個視圖顯示在標籤頁中。標籤頁有一個X按鈕來關閉標籤,我的視圖包含一個託管的Windows窗體控件,它需要調用.Dispose()來清理資源,並且需要知道何時取消訂閱複合命令文件菜單系統。所以,最初,我有一個問題...當標籤頁刪除視圖時,我的ViewModel如何取消訂閱命令? WPF控件中包含的視圖如何知道它何時被刪除?這裏就是我想出了

  1. 標籤頁本身不應該告訴我的程序,如果一個視圖可以或不能
  2. 我需要取消closing事件在程序邏輯的情況下,才能關閉(文件得救了嗎?是/否/取消),當它被關閉,以便
  3. 我需要檢測的能力,我可以就在那個時候清理/註銷

我的解決辦法,以實現我的視圖模型稱爲IRemovable的接口,公開了一個可移動布爾值和一個返回boolea的Remove()方法n(被刪除或沒有)。如果Removable爲true,我的選項卡控件只顯示X按鈕,Tab Control的Closing激發了IRemovable ViewModel的Remove(),如果它返回false,則將ViewModel的Remove返回false的事件參數Canceled屬性設置爲true。

因此,刪除視圖模型可能會提示用戶進行確認,從命令中取消註冊等。該視圖可以處理任何Windows窗體組件中的Closed事件和調用Dispose等(當然,我必須檢查我的View.DataContext是IRemovable)。

不管怎樣,我知道這是不是一個確切的答案,但希望它可以幫助你想出如何解決你自己的問題

相關問題