Мне нужно отобразить около нескольких миллионов элементов в WPF ListBox (я знаю, насколько это плохая идея, но я должен сделать это так). Новые элементы поступают очень быстро, тысячи в секунду, но кроме этого в список не вносятся изменения: элементы никогда не удаляются и не изменяются.
Мне нужно, чтобы элемент управления LisBox обновлялся хотя бы раз в секунду.
Я понимаю, что я получаю виртуализацию пользовательского интерфейса "бесплатно" в WPF (я использую VirtualizedStackPanel
в режиме Recycle
и отложенную прокрутку), но я должен виртуализировать данные. Я совершенно новичок в WPF, поэтому я попытался использовать лучшее существующее решение , которое я нашел. Это работает, но мигает каждый раз, когда счет обновляется, и SelectedItem теряется при каждой перезагрузке (я предполагаю, что это происходит потому, что он запускает CollectionChanged
типа «Reset», который перезагружает всю коллекцию). Я попытался использовать событие «Добавить» вместо «Сброс», но для этого требуется список элементов, которые фактически были добавлены в коллекцию, и на самом деле не имеет никакого смысла выбирать несколько тысяч объектов в секунду, просто чтобы передать их событию и выбросить их, потому что они все равно виртуализированы. Я также попытался просто запустить свойство PropertyChanged
для Count
, чтобы ListBox обновил свой диапазон индекса / отрегулировал полосу прокрутки, начались странные вещи: полоса прокрутки адаптировалась бы к новому количеству, хотя элементы списка не отображались и все еще много мерцания.
Другими словами: как мне сообщить элементу управления ListBox, что N
новые элементы были добавлены в связанную коллекцию, чтобы ListBox просто настраивал диапазон полосы прокрутки (и не спрашивал меня о добавленные элементы, пока они на самом деле не отображаются).
В этом проекте я использую .NET 4.0 и Caliburn.Micro, но сомневаюсь, что это повлияет на возможные решения.