wpf - 对分页列表框中的集合进行排序和过滤

标签 wpf listcollectionview

我有一个包含 10,000 个项目的数据库,您可以在应用运行时添加和删除项目。

我有一个最多显示 100 个项目的列表框,并且支持分页。

您可以对 10,000 个项目进行过滤和排序,这些项目需要立即反射(reflect)在列表框中。

我有一个按钮,可以随机选择一个通过过滤器的项目。

用于此类操作的最佳集合/ View 集是什么?

到目前为止,我的第一步是创建数据库中所有项目的 ObservableCollection,我们将其称为 MainOC

然后通过解析 MainOC 创建一个包含所有与过滤器匹配的项目的 List,我们将其称为 FilteredList

然后根据上面的 List 创建一个包含前 100 个项目的 ListCollectionView

缺点:

  • 每次应用排序操作时,您都必须重新创建 ListCollectionView
  • 每次分页时都必须重新创建 ListCollectionView
  • 每次更改过滤器时,您都必须重新创建 ListCollectionView
  • 每次向 MainOC 添加或删除项目时,您都必须重新创建 ListCollectionView

我缺少更好的方法吗?

例如,我发现您可以将过滤器应用于ListCollectionView。我应该用全部 10,000 个项目填充我的 ListCollectionView 吗?但是我怎样才能限制我的 ListBox 显示的项目数量呢?

我应该直接针对数据库进行过滤和排序吗?我可以直接从数据库构建 FilteredList 并基于此创建我的 ListCollectionView,但这仍然具有上面列出的所有缺点。

寻找您可以提供的任何意见!

最佳答案

这个问题可以使用 DynamicData 轻松解决。 。动态数据是基于rx的,所以如果你不熟悉精彩的Rx,我建议你开始学习它。有相当多的学习曲线,但返回是巨大的。

无论如何回到我的答案,动态数据的起点是将一些数据放入缓存中,该缓存是用如下键构造的

var myCache = new SourceCache<MyObject, MyId>(myobject=>myobject.Id)

显然,作为一个缓存,有一些方法可以添加、更新和删除,所以我不会在这里展示这些方法。

动态数据提供了大量扩展和一些 Controller 来动态询问数据。对于分页,我们需要一些元素来解决这个问题

//this is an extension of observable collection optimised for dynamic data
var collection = new ObservableCollectionExtended<MyObject>();
//these controllers enable dynamically changing filter, sort and page
var pageController = new PageController();  
var filterController = new FilterController<T>(); 
var sortController = new SortController<T>(); 

使用这些 Controller 创建数据流并将结果绑定(bind)到集合,如下所示。

var mySubscription = myCache.Connect()
    .Filter(filterController)
    .Sort(sortController)
    .Page(pageController)
    .ObserveOnDispatcher() //ensure we are on the UI thread
    .Bind(collection)
    .Subscribe() //nothing happens until we subscribe.  

您可以随时更改 Controller 的参数来过滤、排序、分页和绑定(bind)数据,如下所示

//to change page
pageController.Change(new PageRequest(1,100));
//to change filter 
filterController.Change(myobject=> //return a predicate);
//to change sort
sortController .Change( //return an IComparable<>);

就像魔术一样,当任何 Controller 参数发生变化或任何数据发生变化时,可观察集合将 self 维护。

您现在唯一需要考虑的是将数据库数据加载到缓存中所需的代码。

在不久的将来,我将创建此功能的一个工作示例。

有关动态数据的更多信息,请参阅

Dynamic data on Github

Wpf demo app

关于wpf - 对分页列表框中的集合进行排序和过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29684867/

相关文章:

c# - 如何针对 ListCollectionView 编写 linq 查询?

wpf - WPF中的MVVM-用户控件

c# - 使用 TokenLookUpEdit 的 SelectedItems 填充 WPF Datagrid

wpf - 选中的列表框 (WPF)

wpf - 如何同步ListCollectionView.CurrentItem和ListView.SelectedItem?

c# - 如何替换可枚举集合的默认 CollectionView?

wpf - 点击图像但仍然响应鼠标悬停?

c# - WebBrowser 控件 WPF 中的脚本错误

c# - CollectionView 实时排序回调