6

加起来 4 个月前的一个帖子,不幸的是没有收到任何答案。

在带移位的数据网格中使用多选时,我基本上遇到了同样的问题。

当在一个巨大列表中间的某个地方(比如网格中有 1,000,000 个项目,所有数据都虚拟化)并且我要使用 shift + 鼠标单击从 500,000 到 500,050 中进行选择时,网格调用我的“GetEnumerator()”方法虚拟列表(类似于文森特和保罗的实现)。到目前为止,我所做的只是缓存页面上的 SelectMany。但不幸的是,导致没有正确选择行(而 ctrl + 鼠标单击完成了这项工作!)。

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

所以我的问题与上面发布的链接中丹尼尔的问题相同:

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

  • 有没有办法告诉 DataGrid 不要使用 Enumerator 并只获取选定的项目而不是从 0 开始迭代?

非常感谢,希望我有更多的运气至少能得到发人深省的答案,因为关于数据虚拟化的内容并不多。

4

1 回答 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);
}

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

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

于 2013-01-16T07:50:13.883 回答