DataGrid запрашивает при смене множественного выбора с виртуализацией данных
Добавление на пост 4 месяца назад, который, к сожалению, не получил никакого ответа.
Я в основном стою перед той же проблемой при использовании множественного выбора в сетке данных со смещением.
Когда где-то посередине огромного списка (скажем, это 1 000 000 элементов в сетке, все данные виртуализированы), и я должен был выбрать от 500 000 до 500 050, используя shift + щелчок мышью, сетка вызывает метод "GetEnumerator()" моего виртуальный список (аналог реализации Винсента и Пола). То, что я делал до сих пор, было просто SelectMany на кэшированных страницах. Но, к сожалению, это привело к тому, что строки не были выбраны должным образом (в то время как Ctrl + щелчок мышью делает работу!).
Итак, я обнаружил, что DataGrid ожидает все элементы от индекса 0 до последнего элемента выбора. Это, очевидно, не идеально для списка из 1 млн элементов, так как это приведет к запросам на каждый элемент от 0 до (в моем примере) 500 050 и, таким образом, загрузит все из базы данных.
Таким образом, мои вопросы будут такими же, как и у Даниила, написанного выше:
Почему DataGrid запрашивает элементы несколько раз (выбранные элементы запрашиваются ~6-7 раз подряд без видимой причины)?
Есть ли способ сказать DataGrid не использовать Enumerator и просто взять выбранные элементы, а не выполнять итерацию от 0 до?
Большое спасибо, надеясь, что мне больше повезет, если я получу хотя бы размышляющие ответы, так как в отношении виртуализации данных особо нечего найти.
1 ответ
Я нашел решение этой проблемы (по крайней мере, я могу сказать, что это работает для меня).
То, что я в основном сделал, дурачил VirtualList как таковой, что я делаю следующий код:
for (int i = 0; i < Count; i++)
{
int pageIndex = i/PageSize;
int pageOffset = i%PageSize;
IList<TItem> page;
if (pages.TryGetValue(pageIndex, out page))
{
yield return page[pageOffset];
}
yield return default(TItem);
}
Таким образом, я всегда буду получать элементы, которые действительно есть в списке, но ничего не возвращать, когда это является частью виртуализации.
Конечно, это может привести к некоторым другим проблемам, но это пока самое близкое, что я получил по этому поводу.