2014-01-25 2 views
2

Я создаю приложение WPF, которое отображает тысячи записей в datagrid. Я загружаю данные из внешнего источника асинхронно в ObservableCollection и привязывая его к datagrid. В течение всего дня будет добавлено несколько дополнений и обновлений.Соответствующий ObservableCollection

Эксплуатационные характеристики - это наблюдаемый набор, подходящий для такого применения, или я должен искать ObservableDictionary или любую другую подходящую коллекцию?

ответ

0

Я использовал его для отображения в реальном времени до 10 000 записей без каких-либо проблем. Как только вы начнете манипулировать этими многочисленными записями, узкие места, как правило, являются выбором алгоритма и проблемами с виртуализацией данных (или их отсутствием), а не с тем классом, который вы используете. Тем не менее, если вы беспокоитесь об этом, то there's an article here with a WPF-decoupled ObservableCollection, который вы могли бы попробовать использовать вместо этого.

+0

Статья полностью устарела, поскольку «ObservableCollection » был удален из WindowBase и полностью отсоединен от самого WPF с .NET 4.0. – Alejandro

0

DataGrid использует UI-виртуализацию, чтобы рисовать только то, что видно на области порта просмотра. Это уменьшает количество создаваемых элементов пользовательского интерфейса, что делает его лучше в памяти и производительности. Однако, когда вы имеете дело с ObservableCollections, который содержит тысячи элементов, вам следует рассмотреть возможность использования также методов виртуализации данных.

Я бы порекомендовал пойти KIS (Keep It Simple) и проделать простейший подход: Просто используйте .NET ObservableCollection.

Если вы испытываете задержанный пользовательский интерфейс во время обновлений, вам нужно попробовать попробовать какой-то ObservableCollection, который позволяет блокировать обновления пользовательского интерфейса во время фазы обновления (если вам нужно обновить коллекцию в большом количестве предметов за короткое время).

Если вы являетесь опытным пользовательским интерфейсом во время прокрутки или selcting, или ваша память слишком высока, вам также необходимо рассмотреть возможность виртуализации данных.

Успехов

0

ObservableCollection оповещает View для каждого элемента, который добавляется к нему, и он не поддерживает AddRange() метод. Я бы рекомендовал и расширенный класс для ObservableCollection, который поддерживает AddRange() Способ опубликован в этом Answer

Этот класс обновляется для всей массы. Вместо каждого элемента. Остальная производительность будет нести DataGrid, которая по умолчанию поддерживает Virtual StackPanel

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