当按特定列排序时,WPF DataGrid会丢失虚拟化

时间:2016-01-15 22:44:55

标签: wpf sorting datagrid virtualization data-virtualization

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

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

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

我已经尝试过研究ICollectionView,UI虚拟化和数据虚拟化,我读过的唯一可能适用的是关于多行选择(DataGrid row request patterns with data virtualization我将MyDataGrid的SelectionMode设置为Single所以这不应该适用。

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

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

了解它!通过调用堆栈,看起来问题发生在VirtualizingStackPanel的MeasureOverride期间,我注意到它正在调用SyncUniformSizeFlags方法。然后我进入DataGrid的默认样式并将RowHeight设置为固定量,它不再导致问题。

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