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

时间:2015-04-16 20:01:29

标签: wpf listcollectionview

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

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

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

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

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

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

然后通过解析我们称之为List的{​​{1}}来创建与过滤器匹配的所有项目的MainOC

然后根据保存前100个项目的上述FilteredList创建ListCollectionView

缺点:

  • 每次应用排序操作时都必须重新创建List
  • 每次登页时都必须重新创建ListCollectionView
  • 每次更改过滤器时都必须重新创建ListCollectionView
  • 每次将项目添加或移至ListCollectionView时,您都必须重新创建ListCollectionView

我缺少一种更好的方法吗?

例如,我发现您可以将过滤器应用于MainOC。我应该用{10,000}项目填充ListCollectionView吗?但是,我如何限制ListCollectionView显示的项目数?

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

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

1 个答案:

答案 0 :(得分:11)

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

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

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

显然,作为缓存,有添加,更新和删除的方法,所以我不会在这里显示。

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

//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>(); 

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

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.  

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

//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<>);

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

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

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

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

Dynamic data on Github

Wpf demo app