数据虚拟化下,DataGrid在进行多选时的请求问题

6
在4个月前的一篇帖子,我没有收到任何答案。现在我遇到了同样的问题,当在datagrid中使用多选时,按住shift键。
当在一个巨大的列表中(假设在网格中有1,000,000个项目,所有数据都是虚拟的),并且我使用shift +鼠标单击从500,000到500,050进行选择时,网格调用了我的虚拟列表的“GetEnumerator()”方法(与Vincent和Paul的类似实现)。 我做到现在只是在缓存的页面上进行了SelectMany。但不幸的是,结果导致行不能正确选择(而ctrl +鼠标单击可以完成工作!)。
因此,我发现DataGrid实际上期望从索引0到选择的最后一个所有项。显然,对于包含1m项的列表来说,这并不理想,因为这将导致每个项目从0到(在我的示例中)500,050的请求,从而加载所有数据库内容。
所以我的问题与上面链接中的Daniel的问题相同:
  • 为什么DataGrid会多次请求项目(选择的项目会无缘无故地请求~6-7次)?

  • 是否有一种方法告诉DataGrid不要使用Enumerator,而只需选择所选项目而不从0开始迭代?

非常感谢您的帮助,希望我能得到至少引人深思的答案,因为关于数据虚拟化并没有太多可找到的信息。
1个回答

3

我找到了解决这个问题的方法(至少我可以说对我有效)。

我实际上所做的是愚弄 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);
}

那样我总是会得到真正在列表中的项目,但当它是虚拟化的一部分时返回空。当然这可能会导致其他问题,但这是目前我关于这个问题得到的最接近的解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接