2015-04-16 100 views
4

我有一個包含10,000個項目的數據庫,您可以在應用程序運行時將其添加和刪除。對分頁列表框中的集合進行排序和過濾

我有一個ListBox顯示最多100個項目,並支持分頁。

您可以對10,000個項目進行過濾和排序,這些項目需要立即反映在列表框中。

我有一個按鈕,隨機選擇一個項目,只要它通過過濾器。

什麼是用於此類操作的最佳集合/視圖集合?

到目前爲止,我的第一步是創建數據庫中所有項目的ObservableCollection,我們將其稱爲MainOC

然後通過解析MainOC創建一個與過濾器匹配的所有項目的List,我們將其稱爲FilteredList

然後根據上面的List創建一個ListCollectionView,它包含前100個項目。

缺點:

  • 你有充分的應用排序操作的時間來重新創建ListCollectionView
  • 您必須在每次翻頁時重新創建ListCollectionView
  • 每次更換過濾器時都必須重新創建ListCollectionView
  • 每次將物品添加或刪除至MainOC時,您都必須重新創建ListCollectionView

有沒有更好的方法,我失蹤了?

例如,我看到您可以將濾鏡應用到ListCollectionView。我應該使用全部10,000種物品填充我的ListCollectionView嗎?但是,如何限制我的ListBox顯示的項目數?

我應該直接對數據庫進行過濾和排序嗎?我可以直接從數據庫建立FilteredList,並基於此創建我的ListCollectionView,但這仍然具有上面列出的所有缺點。

尋找你可以提供的任何輸入!

回答

7

這是一個很容易使用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

+0

無法解析符號ObserveOnDispatcher – Julien

+1

從安裝的NuGet RX-XAML和包括命名空間System.Reactive.Linq –

+0

試圖建立一個超級簡單例。 https://gist.github.com/julesx/acd0e1c03f9d90bd6094。 僅當我直接添加到OC時,沒有任何內容會顯示在緩存中。我缺少一些基本的東西? – Julien

相關問題