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);
}

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

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

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