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)
就像魔术一样,当任何控制器参数发生变化或任何数据发生变化时,可观察集合将自行维护.
您现在唯一需要考虑的是将数据库数据加载到缓存中所需的代码.
在不久的将来,我将创建一个这个功能的工作示例.
有关动态数据的更多信息,请参阅