Отображать большие отсортированные списки в WPF БЫСТРО?

Я занимаюсь разработкой программы, которая должна отображать длинные (до 500 элементов) списки данных, которые необходимо восстанавливать при изменении их содержимого.

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

Данные должны быть отсортированы, но данные могут также измениться в любое время, и список необходимо восстанавливать каждый раз.

Каков наилучший механизм / метафора для отображения и сохранения всего объекта без блокировки графического интерфейса? У меня есть решение, использующее NotifyCollectionChangedEventArgs и некоторые функции сортировки, но его МЕДЛЕННО - я предполагаю, что он восстанавливает и перестраивает весь GUI каждый раз, когда изменяется элемент данных.

1 ответ

Решение

Посмотрите на классы CollectionView / CollectionViewSource. Эти классы располагаются "между" вашей ObservableCollection и логикой привязки данных WPF для выполнения таких операций, как сортировка, фильтрация и т. Д.

Я подозреваю, что написание ваших собственных функций сортировки из NotifyCollectionChanged является источником ваших проблем с производительностью; это зависит от вашей точной реализации, но, вероятно, во время сортировки списка возникает множество событий CollectionChanged, что приводит к повторному связыванию WPF коллекции на каждой итерации подпрограммы сортировки... которая будет невероятно медленной, поскольку вы описано.

CollectionView и CollectionViewSource не влияют на исходную коллекцию, а только на представление коллекции, отображаемое в пользовательском интерфейсе, поэтому вы должны увидеть значительное ускорение по сравнению с тем, что вы делаете сейчас. Когда был выпущен элемент управления Microsoft DataGrid, у него были демонстрации того, как он отображает и сортирует миллионы строк - и он использует именно эти классы для выполнения своих сортировок. Вы действительно не должны видеть проблемы с производительностью на 500 строк.

Наконец, разница между CollectionView и CollectionViewSource заключается в том, где они предназначены для использования; CollectionView используется, когда вы работаете в C#, CollectionViewSource, когда вы делаете это из XAML. Возможно, вы также захотите взглянуть на эту статью для краткого обзора этих классов.

Другие вопросы по тегам