1

我有 4 种不同的视图和不同的操作。我正在使用 DateTemplate 创建视图

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

我有 ContentControl,所有 ViewModel 都绑定到 Content 属性,比如“ActiveView”

我已经创建了所有 ViewModel 并保存在字典中。当我想更改视图时,我只需将 ActiveView 分配给我要显示的新视图。

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

我们的一个控件不支持 DataBinding,所以我在 View 的后台代码中创建了一些新控件。

我的问题是:当我更改 ActiveView 时,它会在 ContentControl 中创建新的视图和显示。因此,我遇到了问题。我的旧视图仍在记忆中。如何摧毁它们?

目前,我们无法更改设计。我们处于忍受它的境地。

4

1 回答 1

0

如果 vm 在字典中,那么垃圾收集将不会收集它。关于 GC 何时收集对象有很多规则,我自己有时必须在这个话题上刷新自己。关于垃圾收集

有一些方法可以强制进行垃圾收集,但恕我直言,这消除了使用托管代码的好处。一般来说,只要您不持有对该对象的引用,GC 最终应该会收集它。您可以强制进行此类收集,但这表明您的设计有问题。

根据 MSDN:

“可以通过调用 Collect 来强制进行垃圾回收,但大多数情况下,应该避免这样做,因为它可能会产生性能问题。”

于 2013-10-31T13:20:28.263 回答