内存泄漏与WPF中的CollectionViewSource.GetDefaultView()?

时间:2010-09-30 18:02:56

标签: wpf memory-leaks collectionviewsource listcollectionview

我想知道在WPF中使用CollectionViews的最佳实践是什么,特别是使用CollectionViewSource.GetDefaultView()方法。有没有人遇到使用GetDefaultView的任何问题?我们担心它可能会导致一些内存泄漏。

通常更好的做法是手动创建ListCollectionViews而不是依赖GetDefaultView()?

WPF如何管理这些视图?收集时他们会得到GC吗?我看过一些文章说你需要从他们的源集合中分离CollectionViews,否则你会有内存泄漏。

谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

Bea声称使用CollectionViewSource.GetDefaultView()是给定集合的favorite way for accessing the view。此外,我个人从未遇到过使用CollectionViewSource.GetDefaultView()的任何问题,但在特定情况下肯定是可能的。

您必须了解每个集合都有一个默认视图,当您将给定属性绑定到给定集合时,WPF会自动使用视图包装集合并绑定到视图;不是收藏品。

由于这是WPF框架的一部分,因此您必须假设每个集合都有一个与之关联的视图,然后在处理集合时将其处理掉。如果通过可绑定属性引用了该集合,那么引用该集合的关联视图是否会调用CollectionViewSource.GetDefaultView(),因此您仍然处于相同的困境中。

经验evidence存在,直到集合超出范围,关联的视图才会被GC化;但请记住,这是处理具有实现INotifyCollectionChanged的集合。

根据您的情况,可能存在集合和相关视图之间的1:1关系,因此耦合可能不会产生任何障碍。在这种情况下,一旦集合超出范围,视图就是GC',这不是问题。

归结为谨慎行事,并确保您知道在更复杂的情况下发生的事情,以便您采取适当的措施。