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

Jul*_*ien 6 wpf listcollectionview

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

我有一个ListBox,最多显示100个项目,并支持分页.

您可以对10,000个项目进行筛选和排序,这些项目需要立即反映在列表框中.

我有一个按钮,只要它通过过滤器就随机选择一个项目.

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

到目前为止,我的第一步是ObservableCollection在数据库中创建一个我们将调用的所有项目MainOC.

然后List通过解析MainOC我们将调用的内容创建与过滤器匹配的所有项目FilteredList.

然后创建一个ListCollectionView基于上面List的前100项.

缺点:

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

我错过了更好的方法吗?

例如,我看到您可以将过滤器应用于ListCollectionView.我应该填写ListCollectionView所有10,000件商品吗?但是,我如何限制我ListBox显示的项目数量?

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

寻找您可以提供的任何输入!

Rol*_*ant 11

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

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

var myCache = new SourceCache<MyObject, MyId>(myobject=>myobject.Id)
Run Code Online (Sandbox Code Playgroud)

显然是一个缓存有添加,更新和删除的方法所以我不会在这里显示.

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

//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>(); 
Run Code Online (Sandbox Code Playgroud)

使用这些控制器创建数据流,并将结果绑定到这样的集合.

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.  
Run Code Online (Sandbox Code Playgroud)

您可以随时更改控制器的参数以对数据进行过滤,排序,分页和绑定,如下所示

//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<>);
Run Code Online (Sandbox Code Playgroud)

就像魔术一样,当任何控制器参数发生变化或任何数据发生变化时,可观察集合将自行维护.

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

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

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

Github上的动态数据

Wpf演示应用

  • PageController、FilterController&lt;T&gt; 和 SortController&lt;T&gt; 是否已过时?我在当前的 NuGet 包 DynamicData 6.1.4 中找不到它们 (2认同)