2013-10-31 52 views
1

我有4種不同的視圖,具有不同類型的操作。我使用DateTemplate創建視圖用DataTemplate創建的UserControl處理問題

<DateTemplate DateType={X:Type HomeViewModel}" > 
    <HomeView> 
</DateTemplate> 
<DateTemplate DateType={X:Type DeviceDateViewModel}" > 
    <DeviceDateView> 
</DateTemplate> 

,我有ContentControl中,所有的ViewModels綁定到Content屬性,說「活動視圖」

我已創建的所有視圖模型,並保存在字典。當我想改變視圖時,我只是將ActiveView分配給我想要顯示的新視圖。

void ActiveteView(ViewType viewType) 
{ 
    ActiveView = GetViewFromDictionary(viewType); 
} 

我們的一個控件不支持DataBinding,所以我在View的後面代碼中創建了一些新的控件。

我的問題是:當我更改ActiveView時,它會在ContentControl中創建新的視圖和顯示。因此,我遇到了問題。我的舊視圖仍在記憶中。如何摧毀他們?

在這個時候,我們不能改變設計。我們正處在與之共存的狀態中。

回答

0

如果vm在字典中,那麼垃圾收集將不會收集它。關於GC何時收集對象有一系列規則,我自己不得不偶爾刷新一下這個主題。 All about Garbage collection

有辦法強制垃圾收集,但恕我直言,避免使用managed code的好處。一般來說,只要你不堅持引用該對象GC,最終應該收集它。你可以強制這樣的收集,但這可能表明你的設計有問題。

根據MSDN:

「這是可能通過調用收集到強制進行垃圾收集,但大部分時間,這應該避免,因爲它可能會產生性能問題。」

+0

我我沒有配置虛擬機,當應用程序還活着時我不需要這樣做。我的問題是,當我更改ActiveView時,WPF DateTemplate(我相信IOC會這樣做)創建新視圖並嘗試銷燬舊視圖。這裏我們參考了3'r零件控制。所以這個觀點不會被破壞。 – Mohanavel

+0

它是如何去試圖摧毀舊的?它是否調用IDisposable.Dispose或〜終結器?也許把代碼放在其中任何一個去取消參考部分控制都可以。這似乎不是一個很好的理由來使用〜終結器,但正如你所說,你不能改變設計。 –

+0

好吧,我沒有IDispose。即使添加IDisposable接口,我也不會獲得任何好處。我沒有任何查看權限。實際上,我無法訪問View對象。 〜終結者也沒有打。 – Mohanavel