Запросы 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?

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


person Alex Endris    schedule 15.01.2013    source источник


Ответы (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);
}

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

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

person Alex Endris    schedule 16.01.2013