Как работать с ListBox с огромным количеством ItemSource в wpf?

В моей работе с WPF есть ListBox с огромным количеством ItemSource (Observablecollection, более 400000, включая изображение, строку и т. Д.), И каждый раз, когда я его запускал, для загрузки ListBox требовалось много времени и места. Есть ли какое-нибудь хорошее решение с этим справиться?


person Chobits    schedule 30.09.2013    source источник
comment
Ты с сервера загружаешь что ли?   -  person Mateusz Dembski    schedule 30.09.2013


Ответы (1)


Просто имея дело с частью вашей проблемы, связанной с UI и WPF: вам необходимо виртуализировать свой ListBox, что означает, что в элемент управления загружается не весь 'ItemsSource', а только та часть, которая отображается в настоящее время (плюс немного для будьте готовы, когда пользователь прокручивает страницу вниз). WPF ListBox поддерживает виртуализацию «из коробки», используя присоединенные свойства VirtualizingStackPanel.

Вот отрывок, который показывает принцип использования:

<ListBox ItemsSource="{Binding Items}"
         VirtualizingStackPanel.IsVirtualizing="True" 
         VirtualizingStackPanel.VirtualizationMode="Recycling">
</ListBox>

Если вы проведете небольшое исследование по этой теме, вы найдете множество ресурсов, которые помогут вам правильно реализовать виртуализацию.

При этом вышесказанное касается только проблемы производительности при рендеринге пользовательского интерфейса. Список элементов, которые вы используете как ItemsSource, по-прежнему будет загружаться полностью за кулисами, поскольку это не имеет ничего общего с WPF. С 400 КБ наборов данных, включая изображения (скажем, по 500 КБ), вам потребуется больше памяти, чем доступно на любой стандартной машине. На самом деле я удивлен, что он вообще работает, но это сильно зависит от размера изображения. В любом случае, ваш подход к загрузке такого количества данных в память далек от масштабируемости. Подумайте о редизайне, загружайте нужные вам биты и отображайте их с помощью виртуализации. Ни один пользователь никогда не будет работать с полмиллионом наборов данных за раз ...

person Marc    schedule 30.09.2013