7

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

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

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

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

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

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

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

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

缺点:

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

我缺少更好的方法吗?

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

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

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

4

1 回答 1

15

这是一个使用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<>);

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

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

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

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

Github 上的动态数据

Wpf 演示应用程序

于 2015-04-17T08:59:42.890 回答