WPF的ICollectionView.filter包含大量数据

我正在开发一个wpf应用程序,其中包含一个包含大量数据(10 000到100 000)行的列表视图。 用户可以将各种filter应用于此列表视图,使filter逻辑非常先进(并且速度慢)。 目前,我的代码的相关部分如下所示:

ICollectionView view = CollectionViewSource.GetDefaultView(hugeList.ItemsSource); view.Filter = new Predicate(FilterCallback); private bool FilterCallback(object item) { //Filter logic } 

但是这会在UI线程中运行并在过滤时阻止整个应用程序,这会给用户带来非常糟糕的体验。 所以我的问题是:有没有人知道在wpf中过滤listview的“更好”方法,还是应该过滤底层的ObservableCollection

密切关注您的过滤function。 确保您没有进行任何不必要的装箱/拆箱,并且您没有进行大量计算。 你还应该注意你正在使用哪种CollectionView,有些比其他更快。 来自Bea关于排序的post :

  • 如果您的源实现IEnumerable,则会创建CollectionView 。 如果源实现IEnumerable,您将无法对集合进行排序或分组(您只能对其进行过滤)。 此外,如果源具有大量项目或执行动态操作(如插入和删除),则perf不是最佳选择。 如果这是您的方案,您应该考虑让您的源实现更强大的接口。 ICollection稍好一些,因为它提供了Count属性。

  • ListCollectionView是源实现IList时创建的视图类型。 与IEnumerable和ICollection相比,IList对大型或动态列表执行得更好,因为它提供了一个索引器,允许我们快速随机访问。 此外,IList允许排序,分组和过滤。 但理想情况下,您的源集合派生自ObservableCollection,它是数据绑定中所有集合的母亲,因为它提供了一些额外的好处,例如属性和集合更改通知。

  • BindingListCollectionView是源集合实现IBindingList时由Avalon创建的视图类型。 这是我们在ADO.NET场景中处理的视图。 它支持排序和分组,但不支持传统的过滤。 相反,它有一个额外的CustomFilter属性,它将过滤委托给DataView(有关更多详细信息,请参阅我在ADO.NET上的post)。

您可以像@mihi所说的那样将过滤踢到另一个线程但是我已经使用CollectionViews在一个ObservableCollection上同时运行多个filter,对象上有50,000个项目,有~60个变量(数据库表中的列),没有明显的延迟。

我在filter函数中立即注意到的一件事是输入是Object类型,这可能意味着你在函数内进行类型转换,可能不需要。 您还使用不包含返回类型的Predicate,因此可能需要在CollectionView的过滤方法中进行某些类型转换或reflection,并且可能会降低您的速度。

您是否考虑过在另一个线程中过滤或使用调度程序?

WPF线程:使用调度程序构建响应更快的应用程序,可以很好地概述一些可用的线程选项。