我目前使用一個ContentControl中顯示通過設置虛擬機,並使用這樣的默認數據模板,我的看法:免費存儲在ContentControl中使用
<UserControl.Resources>
<DataTemplate DataType="{x:Type vm:MyViewViewModel}">
<views:MyView />
</DataTemplate>
</UserControl.Resources>
<ContentControl Content="{Binding ContainerContent}"/>
這裏是我的ContainerContent:
public ViewModelBase ContainerContent
{
get
{
return _containerContent;
}
set
{
if (_containerContent != null)
_containerContent.Cleanup();
_containerContent = value;
RaisePropertyChanged("ContainerContent");
}
}
我目前使用SimpleIoc通過服務定位器來加載視圖模型:
ContainerContent = ServiceLocator.Current.GetInstance<MyViewViewModel>();
這很好,並正確顯示我的視圖和viewModel分配給內容。
不幸的是,當我想從我的ContentControl中刪除視圖(和視圖模型)時,由於ViewModel,View和SimpleIoc之間的發佈順序,我的內存仍然被使用。視圖有一段時間引用它認爲這是定時由於在容器上
我目前使用的方法,以除去內容RaisePropertyCHange後的結合):
public void QuitCurrentContainerViewModel<T>() where T : class
{
ContainerContent = null;
Task.Factory.StartNew(() =>
{
if (/*!*/SimpleIoc.Default.ContainsCreated<T>())
{
SimpleIoc.Default.Unregister<T>();
}
DispatcherHelper.RunAsync(() =>
{
MessageBox.Show("Do GC now");
GC.Collect();
}, DispatcherPriority.ApplicationIdle);
});
}
(使用調度和優先級是一個測試)
如果我稱之爲有時我的記憶被正確釋放,但並非總是如此。
在每一種情況下,如果我從例如快捷方式強制GC.Collect,我的記憶是正確管理。
在我的情況下釋放內存的好方法是什麼?
謝謝!
編輯:我的壞,它正常工作與代碼(在我QuitCurrentContainerViewModel方法我使用這個檢查:
if (!SimpleIoc.Default.ContainsCreated<T>())
但我需要這樣的:
if (SimpleIoc.Default.ContainsCreated<T>())
這樣,它似乎工作正常
感謝您的回覆。我已經試圖實現Idisposable沒有成功。它認爲dispose方法未被調用,因爲視圖在刷新之前「阻止」實例。 關於內存消耗,我使用私有字節的進程資源管理器性能視圖。 – Tchoupi