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
し、それに基づいて作成することもできますが、これには上記のすべての短所があります。
あなたが提供できる入力を探しています!
これは、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<>);
そして、まるで魔法のように、コントローラーパラメーターのいずれかが変更されたとき、またはデータのいずれかが変更されたときに、監視可能なコレクションは自己維持します。
ここで考慮しなければならないのは、データベースデータをキャッシュにロードするために必要なコードだけです。
近い将来、この機能の実用的な例を作成します。
動的データの詳細については、を参照してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加