Концепции и реализация виртуализации данных ListView - PullRequest
0 голосов
/ 08 декабря 2018

Я пытаюсь заставить простой ListView работать при потенциальной загрузке тысяч элементов.Кажется, что лучший способ сделать это - использовать виртуализацию, особенно виртуализацию данных.Но я не могу заставить его работать, или я просто неправильно понимаю концепции.

У меня есть простой репозиторий, возвращающий классы POCO, подобные этому из Sqlite:

public async Task<IEnumerable<T>> FindAllAsync(Action<T> predicate);

Затем в XAML у меня есть что-то вроде этого:

<Style x:Key="VirtualisedMetroListView" BasedOn="{StaticResource MetroListView}" TargetType="{x:Type ListView}">
    <Setter Property="ScrollViewer.CanContentScroll" Value="True" />
    <Setter Property="ScrollViewer.IsDeferredScrollingEnabled" Value="True" />
    <Setter Property="VirtualizingStackPanel.IsVirtualizing" Value="True" />
    <Setter Property="VirtualizingStackPanel.VirtualizationMode" Value="Recycling" />
</Style>

Какой ListViewиспользует.Теперь я действительно ничего не знаю о VirtualizationStackPanel или MahApps VirtualisedMetroListView, потому что, особенно для последнего, очень мало документации.Но вышеупомянутая конструкция, кажется, работает для некоторых людей?

В любом случае, это не работает для меня, и, честно говоря, я не понимаю, почему это должно!Разве виртуализация данных не должна извлекать только то, что видно (запрошено) из ListView?Но как это будет работать для моего репозитория выше?Он всегда возвращает все элементы T. Не только 20 видимых в списке.

У кого-нибудь есть ссылки на рабочий пример этого?Или, может быть, терпение объяснить мне эту концепцию:)

Спасибо.

1 Ответ

0 голосов
/ 08 декабря 2018

Панели виртуализации - это виртуализация пользовательского интерфейса, а не виртуализация данных.

Эксперты по пользовательскому интерфейсу рекомендуют показывать пользователю максимум около 200 строк.Больше и вам нужно фильтровать, чтобы пользователю не приходилось прокручивать, прокручивать и прокручивать .... чтобы найти одну строку, которую он ищет.

Как так, я предлагаю вам использовать skipи возьми в свой linq.Либо добавьте другой метод, который делает это внутренне в вашем хранилище, либо предоставьте iqueryable, а не ienumerable.Затем вы можете зациклить асинхронный метод.Получите первые 100 записей, используя асинхронный вызов.Перевести на viewmodels.Верните это в поток пользовательского интерфейса.Foreach, добавь в свою коллекцию.Освободите поток пользовательского интерфейса, ожидая задание. Задержка (500) или что-то еще.И ... продолжайте пропускать и брать, пока у вас не будут все ваши данные.

Если вы отсортируете их в том порядке, в котором они обычно хотят с ними работать, то вы можете реализовать пейджинг пользователей.Получите первый полный экран с помощью take (50), а затем дайте им возможность «пролистать», нажав следующую кнопку.Или задайте элемент управления кнопками страницы, чтобы они могли отображаться в любом месте списка.

...