2013-10-31 20 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