WPF DataGrid теряет виртуализацию при сортировке по определенным столбцам

Я использую WPF DataGrid, который привязан к пользовательскому ItemsSource, который реализует IList (и НЕ IEnumerable). Пользовательский ItemsSource выполняет виртуализацию данных и загружает страницы элементов только по мере необходимости. MyDataGrid на самом деле наследует от DataGrid и переопределяет обработку методов сортировки DataGrid, так что я могу поддерживать виртуализацию данных во время сортировки. У меня виртуализация пользовательского интерфейса включена для MyDataGrid.

Когда я запускаю приложение, MyDataGrid отображается очень хорошо, сообщает мне, что у меня есть примерно 20000 элементов, и запрашивает только у моего ItemsSource первые 20 или около того элементов. Затем я могу щелкнуть заголовки столбцов, чтобы отсортировать различные столбцы, и снова мой ItemsSource должен только перезагрузить первую страницу из 40 элементов, потому что MyDataGrid попросил обновить только первые 20 или около того.

НО, когда я щелкаю по столбцу "Фамилия" для сортировки, MyDataGrid теряет свою виртуализацию пользовательского интерфейса и просит мой ItemsSource загрузить каждый элемент, даже если ему нужны только первые 20 или около того. Я могу наблюдать, как он запрашивает каждый элемент по индексу (это [0]).

Я попытался исследовать ICollectionView, виртуализацию пользовательского интерфейса и виртуализацию данных, и единственное, что я прочитал, что, возможно, это применимо, касается выбора нескольких строк (в шаблонах запросов строк DataGrid с виртуализацией данных я установил параметр SelectionMode для MyDataGrid в значение Single, поэтому это не должно применяться.

Другая подсказка может заключаться в том, что перед сортировкой по фамилии первый элемент в MyDataGrid имеет фамилию, начинающуюся с буквы V (очень поздно в алфавите), и что я действительно могу отсортировать список в порядке убывания по фамилии без потери виртуализации. То же самое происходит с моим столбцом Заголовок, который имеет первый элемент, который начинается с буквы S. У меня нет проблем ни с одним из других столбцов.

Есть идеи?

1 ответ

ДОГАДАТЬСЯ!!! Просматривая стек вызовов, выяснилось, что проблема возникала во время MeasureOverride VirtualizingStackPanel, и я заметил, что он вызывает метод SyncUniformSizeFlags. Поэтому я перешел к стилю по умолчанию для DataGrid и установил фиксированное значение RowHeight, и это больше не вызывает проблемы.

Таким образом, кажется, что DataGrid может потерять свою виртуализацию, если не установлен фиксированный RowHeight. До сих пор не знаю, почему выбор сортировки в порядке возрастания по фамилии или названию вызвал необходимость повторной синхронизации высот строк, но я могу обойти эту проблему.

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