0

我正在使用绑定到实现 IList(而不是 IEnumerable)的自定义 ItemsSource 的 WPF DataGrid。自定义 ItemsSource 执行数据虚拟化并仅根据需要加载项目页面。MyDataGrid 实际上继承自 DataGrid 并覆盖 DataGrid 排序方法的处理,以便我可以在排序时维护数据虚拟化。我为 MyDataGrid 打开了 UI 虚拟化。

当我运行应用程序时,MyDataGrid 显示得很好,告诉我我有大约 20,000 个项目,并且只向我的 ItemsSource 询问前 20 个左右的项目。然后我可以单击列标题对各个列进行排序,并且我的 ItemsSource 只需重新加载 40 个项目的第一页,因为 MyDataGrid 只要求刷新前 20 个左右。

但是,当我单击我的姓氏列进行排序时,MyDataGrid 失去了它的 UI 虚拟化并要求我的 ItemsSource 加载每个项目,即使它只需要前 20 个左右。我可以看到它按索引(this[0])要求每个项目。

我已经尝试研究 ICollectionView、UI 虚拟化和数据虚拟化,我读过的唯一可能适用的内容是关于多行选择(在DataGrid 行请求模式与数据虚拟化中,我已将 MyDataGrid 的 SelectionMode 设置为 Single 所以这不应该适用。

另一个提示可能是,在按姓氏排序之前,MyDataGrid 中的第一项具有以字母 V 开头的姓氏(在字母表中很晚),并且我实际上可以按姓氏的降序对列表进行排序在不丢失虚拟化的情况下。同样的事情发生在我的 Title 列中,它的第一个项目以字母 S 开头。我对任何其他列都没有问题。

有任何想法吗?

4

1 回答 1

1

弄清楚了!!!查看调用堆栈,问题似乎是在 VirtualizingStackPanel 的 MeasureOverride 期间发生的,我注意到它正在调用 SyncUniformSizeFlags 方法。所以我然后进入 DataGrid 的默认样式并将 RowHeight 设置为固定数量,它不再导致问题。

因此,当未设置固定的 RowHeight 时,DataGrid 似乎会失去其虚拟化。仍然不知道为什么选择按姓氏或标题升序排序会导致它想要重新同步行高,但我可以解决这个问题。

于 2016-01-18T21:05:43.357 回答