2015-04-16 3 views
4

У меня есть база данных с 10 000 элементов, к которым вы можете добавить и удалить во время работы приложения.Сортировка и фильтрация коллекции в Paged ListBox

У меня есть ListBox, который отображает не более 100 элементов и поддерживает подкачку.

Вы можете фильтровать и сортировать по 10 000 предметов, которые необходимо немедленно отобразить в списке.

У меня есть кнопка, которая случайным образом выбирает элемент, если он проходит фильтры.

Каков наилучший набор коллекций/видов, используемых для такого рода операций?

До сих пор моим первым шагом было создать ObservableCollection ВСЕХ пунктов в базе данных, которые мы будем называть MainOC.

Затем создайте List из всех элементов, которые соответствуют фильтру парсинга MainOC, который мы будем называть FilteredList.

Затем создайте ListCollectionView на основе вышеуказанного List, который содержит первые 100 предметов.

МИНУСЫ:

  • Вы должны воссоздать ListCollectionView каждый раз, когда применяется операция сортировки.
  • Вы должны воссоздать ListCollectionView при каждой странице.
  • При каждом изменении фильтра вы должны воссоздать ListCollectionView.
  • Вы должны воссоздать ListCollectionView каждый раз, когда предмет добавляется или удаляется до MainOC.

Есть ли лучший подход, который мне не хватает?

Например, я вижу, что вы можете применять фильтры к ListCollectionView. Должен ли я заполнять ListCollectionView всеми 10 000 предметов? Но тогда как я могу ограничить количество предметов, отображаемых моим 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

Установка Rx-Xaml из NuGet и включают в себя пространство имен System.Reactive.Linq –

+0

пытался настроить супер простой пример. https://gist.github.com/julesx/acd0e1c03f9d90bd6094. Ничего не отображается, когда я добавляю в кеш, только когда я добавляю непосредственно к OC. Я что-то пропустил? – Julien

Смежные вопросы