4

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

通常手动创建ListCollectionViews而不是依赖GetDefaultView()会更好吗?

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

感谢您的帮助!

回答

2

Bea指出使用CollectionViewSource.GetDefaultView()是她给定集合的favorite way for accessing the view。另外,我个人从来没有遇到过使用CollectionViewSource.GetDefaultView()的任何问题,但它在给定的情况下肯定是可能的。

您必须明白,集合都有一个默认视图,并且当您将给定的属性绑定到给定的集合时,WPF会自动将该集合与视图一起包装并绑定到视图;不是集合。

因为这是WPF框架的一部分,所以您必须假设每个集合都有一个与之关联的视图,然后在集合被处置时它将被丢弃。如果通过可绑定属性对集合进行引用,则会引用该集合的相关视图,无论您是否拨打电话号码CollectionViewSource.GetDefaultView(),所以您仍然处于同一个困境中。

经验evidence的存在,直到集合超出范围,关联的视图将不会GC'ed;但是请记住,这是处理与实施INotifyCollectionChanged收集。

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

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