如何使用CollectionView(或xaml里的CollectionViewSource)

这篇文章写得比较精简(又是这个网站!)

更全面的是这篇文章,所以除了推荐的CollectionViewSource.GetDefaultView外,我们也可以自己new一个collectionView的具体实现类。

一个泄漏:只是保持了CollectionView的引用,但是如果CollectionView用到了Binding上,就可能会使UI元素全都被保持在内存里无法释放(如果数据集合一直都活着的话)
 关于CollectionView的View的缓存和管理,可以看代码的注释(拷贝出来看),结论就是只有当数据集合的所有View都不再使用了,才会都被释放掉,若有ViewA在被使用中,则ViewB也会留在内存里。不同的View的key是CollectionViewSource(Xaml中的代理,所以在xaml里用这套是会有缓存管理的)

关于ListBox的ItemsPanel和Template的备忘

http://stackoverflow.com/questions/1924089/listbox-virtualizingstackpanel-and-smooth-scrolling-in-wpf

ItemsPanel属性需要一个ItemsPanelTemplate类型的元素,而其中必须要有一个VirtualizingStackPanel(需要Panel这个集合容器),如果某种style让它变成了普通的StackPanel,就没有virualization的功能了.
Template属性需要一个ControlTemplate元素,里面放一个WPF UI元素就行,这里我们可以直接放VirtualizingStackPanel。
两种方法都可以改变ListBox的布局(不是ListBoxItem),因为作为ItemsControl子类,有ItemsPanel这个FrameworkTemplate;作为Control的子类,又有Template(ControlTemplate类型,也是FrameworkTemplate)。

但是,第二种方法是直接改变了ListBox的Template,避免使用了默认的ItemsPresenter,ListBox本身的一些功能也会受影响,包括ItemsPanel,GroupStyle的设置,全都不再生效了–你要自己实现。第一种方式指定的ItemsPanelTemplate之所以能生效,是因为会被ItemsPresenter使用,所以必须依赖默认的ItemsPresenter的实现(在默认的ControlTemplate里)

另外,查看默认各种控件的Template的工具(利用了XamlWriter)

show me the templates,好东西。