WPF ListView с миллионами строк
Мне нужно отобразить очень большой объем данных в виде списка, до 5 миллионов и более строк. Я пытаюсь найти решение, в котором я могу показать все 5 миллионов элементов, не имея все 5 миллионов элементов в памяти своих приложений.
Таким образом, в основном идея заключается в том, что отображается только небольшое количество элементов, например 1 КБ или 2 КБ, и при прокрутке новые данные извлекаются из базы данных по требованию. Так что приложение никогда не имеет более чем пару тысяч элементов в памяти приложения. Однако пользователь не должен понимать, что это сделано, просмотр списка должен вести себя так, как если бы он имел 5 миллионов строк. Это означает, что если он перетаскивает полосу прокрутки вниз, она должна отображать последнюю из 5 миллионов строк, а не последнюю из пары тысяч строк, находящихся в данный момент в памяти.
Кто-нибудь из вас имеет представление о том, как добиться такой возможности? Я благодарен за любой вклад, который вы можете предоставить.
Спасибо, m00ni
1 ответ
Виртуализация данных в wpf широко обсуждается - вот хорошая отправная точка.
Я реализовал подход, который несколько отличается от всего, что я нашел в Интернете. Это не идеально, но вполне соответствует моим потребностям.
У меня есть универсальный интерфейс ItemsProvider, который может пролистывать данные и предоставляет некоторые другие основные функции и информацию о данных поддержки. Я также создал класс VirtualizationManager, который наследуется от DependencyObject
и имеет свойства зависимости ScrollableHeight
а также VerticalOffset
, Они связаны с соответствующими свойствами на ScrollViewer
(найдено в шаблонах вашего тоньше ItemsControls
). Когда любое из этих свойств изменяется, они запускают обратный вызов, который вычисляет, насколько близко средство просмотра прокрутки находится к концу (в настоящее время загруженного) списка - для этого моему VirtualizationManager нужен дескриптор ItemsProvider - и, если это меньше некоторого минимального значения, ItemsProvider получает указание загрузить следующую страницу. Вся штуковина может быть установлена на ItemsControl
через набор прикрепленных свойств.
Моя реализация довольно своеобразна, но идея довольно проста.
Если вы имеете дело с очень большими списками, вам нужно решение, которое не только загружает пошагово, но и выгружает старые элементы. По ссылке выше есть как минимум одно такое решение.