当使用数据虚拟化进行多重选择时,DataGrid会请求

Ale*_*ris 6 wpf datagrid data-virtualization

添加4个月前的帖子,遗憾的是没有得到任何答案.

在带有shift的数据网格中使用多选时,我基本上站在同一个问题之前.

当在一个巨大的列表中间的某个地方(说它是网格中的1,000,000个项目,所有数据都已虚拟化)而我使用shift +鼠标点击从500,000到500,050中选择,网格调用我的"GetEnumerator()"方法虚拟列表(类似于Vincent和Paul的实现).到目前为止我所做的只是缓存页面上的SelectMany.但不幸的是导致行没有被正确选择(当ctrl +鼠标点击完成工作!).

所以我发现,DataGrid实际上期望从索引0到最后一个选择的所有项目.显然,这对于1m项目的列表并不理想,因为这将导致从0到(在我的示例中)500,050中的每个项目的请求,从而将所有内容加载到数据库中.

所以我的问题与丹尼尔在上面发布的那些问题相同:

  • 为什么DataGrid多次请求项目(连续6-7次请求所选项目,没有明显原因)?

  • 有没有办法告诉DataGrid不要使用枚举器,只是选择项目而不是从0开始迭代?

非常感谢,希望我能更好地获得至少引人深思的答案,因为没有太多关于数据虚拟化的信息.

Ale*_*ris 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);
}
Run Code Online (Sandbox Code Playgroud)

这样,我将始终获得列表中真正存在的项目,但当它是虚拟化的一部分时,什么也不返回。

当然,这可能会导致一些其他问题,但这是迄今为止我对此最接近的问题。