WPF: каков самый эффективный/быстрый способ добавить объекты к ListView?

Я должен отобразить много строк в сетке, добавленной в довольно высокой частоте (до 10 строк в секунду в некоторых случаях), я выбрал ListView, потому что я принимаю, самое быстрое управление сеткой в WPF. (конечно, намного быстрее, чем GridView)

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

Мой первый подход связывал его с ObservableCollection, но через некоторое время, загрузка ЦП повышается, и целое Окно становится нервным.

Чем я пытался связать его с обычным Списком, который, кажется, быстрее, однако я действительно должен назвать.Refresh () в списке часто, который через некоторое время хлопает ЦП также.

Чем я делал попытку разделения на подклассы, ObservableCollection для разделения на блоки вставляет надежду, что пакетная обработка их улучшила бы рабочую нагрузку CPU производительности/уменьшения, но этот подход, кажется, требует вызова CollectionView. Обновление, которое совпадает со Сбросом вызова () на наборе, и также неэффективный, когда существует много объектов в наборе.

Очистка observablecollection и, чем вызов myListView. Объекты. Обновление () для возвращения его вниз 0 возвращает использование CPU начальной точке.

Запуск исчерпать идеи здесь.. Снова, моя цель здесь, состоит в том, чтобы добавить/отобразить много объектов и отобразить сетку на 8 столбцов самым производительным способом.. ListView кажется хорошим, просто должны быть некоторые способы, которыми я мог далее настроить его..

ОБНОВЛЕНИЕ

после профилирования, строк ObservableCollection 800k в сетке, большая часть CPU интенсивная работа сделана:

  • (75%-я) Система. Windows. Медиа. MediaContext. RenderMessageHandler (возражают resizedCompositionTarget),
  • (20%) ObservableCollection. OnCollectionChanged (NotifyCoolectionChanged..)

хотя в зависимости от сессии те числа варьируются значительно..

ОБНОВЛЕНИЕ 2.. хорошо BindingList, кажется, явный победитель здесь.

вот являются результаты (в галочках) бок о бок с 1 миллионом строк каждым (и добавление 10 объектов в секунду):

ObservableCollection: http://i.imgur.com/7ZoSv.png

BindingList http://i.imgur.com/jm5qF.png

Вы видите полное понижение активности ЦП и приблизительно половины галочек, требуемых обработать дерево в Привязке случая Списка! Моя благодарность Akash для этой прекрасной идеи.

17
задан Community 23 May 2017 в 11:54
поделиться

1 ответ

Вместо использования ObservableCollection я предлагаю класс BindingList, вы можете сделать что-то вроде этого ..

BindingList<string> list = new BindingList<string>();

list.AllowEdit = true;
list.AllowNew = true;
list.AllowRemove = true;

// set the list as items source
itemCollection.ItemsSource = list;

// add many items...

// disable UI updation
list.RaiseListChangedEvents = false;

for each(string s in MyCollection){
   list.Add(s);
}

// after all.. update the UI with following
list.RaiseListChangedEvents = true;
list.ResetBindings(); // this forces update of entire list

Вы можете включать / отключать обновление даже партиями, вместо того, чтобы добавлять все сразу, BindingList работает лучше, чем ObservableCollection в весь мой пользовательский интерфейс, мне интересно, почему везде люди больше говорят о ObservableCollection, когда BindingList действительно заменяет ObservableCollection.

19
ответ дан 30 November 2019 в 13:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: