WPF ListView с миллионами строк

Мне нужно отобразить очень большой объем данных в виде списка, до 5 миллионов и более строк. Я пытаюсь найти решение, в котором я могу показать все 5 миллионов элементов, не имея все 5 миллионов элементов в памяти своих приложений.

Таким образом, в основном идея заключается в том, что отображается только небольшое количество элементов, например 1 КБ или 2 КБ, и при прокрутке новые данные извлекаются из базы данных по требованию. Так что приложение никогда не имеет более чем пару тысяч элементов в памяти приложения. Однако пользователь не должен понимать, что это сделано, просмотр списка должен вести себя так, как если бы он имел 5 миллионов строк. Это означает, что если он перетаскивает полосу прокрутки вниз, она должна отображать последнюю из 5 миллионов строк, а не последнюю из пары тысяч строк, находящихся в данный момент в памяти.

Кто-нибудь из вас имеет представление о том, как добиться такой возможности? Я благодарен за любой вклад, который вы можете предоставить.

Спасибо, m00ni

1 ответ

Решение

Виртуализация данных в wpf широко обсуждается - вот хорошая отправная точка.

Я реализовал подход, который несколько отличается от всего, что я нашел в Интернете. Это не идеально, но вполне соответствует моим потребностям.

У меня есть универсальный интерфейс ItemsProvider, который может пролистывать данные и предоставляет некоторые другие основные функции и информацию о данных поддержки. Я также создал класс VirtualizationManager, который наследуется от DependencyObject и имеет свойства зависимости ScrollableHeight а также VerticalOffset, Они связаны с соответствующими свойствами на ScrollViewer (найдено в шаблонах вашего тоньше ItemsControls). Когда любое из этих свойств изменяется, они запускают обратный вызов, который вычисляет, насколько близко средство просмотра прокрутки находится к концу (в настоящее время загруженного) списка - для этого моему VirtualizationManager нужен дескриптор ItemsProvider - и, если это меньше некоторого минимального значения, ItemsProvider получает указание загрузить следующую страницу. Вся штуковина может быть установлена ​​на ItemsControl через набор прикрепленных свойств.

Моя реализация довольно своеобразна, но идея довольно проста.

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

Другие вопросы по тегам