自定义缓存ListView与过滤

本文关键字:过滤 ListView 缓存 自定义 | 更新日期: 2023-09-27 18:13:09

在我的c# WPF应用程序中有一个ListView和一个GridViewItemsSourceObservableCollection<MyClass>绑定到ViewModel上创建的ListCollectionView。我使用ListCollectionView进行动态排序、过滤和分组,所有这些都可以通过View进行调整或打开/关闭。

当我更改过滤器或打开/关闭分组时,将重新创建所有可视列表视图项,这将导致UI冻结大约一秒钟。因为我显示了大约250个项目,大约有10列(其中一些有带有进度条的单元格模板),所以这并不奇怪。

现在,我知道显而易见的答案是启用虚拟化。然而,这会带来一些不良影响,例如滚动变得不稳定,或者滚动条在滚动时改变其大小(这在分组时发生,因为组的高度不同,因此虚拟化堆栈面板一开始无法正确计算总高度)。

我想做的是让ListView为原始列表中的每个项目保留一个视觉元素(未过滤和未排序,即ObservableCollection<MyClass>),然后根据ListCollectionView的变化仅添加或从视觉树中删除。

我希望这个解决方案可以提高我的应用程序的性能,因为我很少改变原始列表,但我经常改变过滤,排序和分组。

我需要创建一个自定义控件继承ListView(或GridView)做到这一点,或者有另一种方式?

自定义缓存ListView与过滤

尝试使用DeferRefresh,这会延迟自动刷新,直到存在延迟周期。看看是否有帮助。

CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(SomeListView.ItemsSource);
using (view.DeferRefresh())
{
  view.GroupDescriptions.Clear();
  view.GroupDescriptions.Add(new PropertyGroupDescription("Country"));
  view.GroupDescriptions.Add(new PropertyGroupDescription("Active"));
}
http://blogs.msdn.com/b/matt/archive/2008/08/28/collectionview-deferrefresh-my-new-best-friend.aspx