【问题标题】:WPF DataGrid loses virtualization when sorted by specific columnsWPF DataGrid 在按特定列排序时失去虚拟化
【发布时间】:2016-01-15 22:44:54
【问题描述】:

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

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

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

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

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

有什么想法吗?

【问题讨论】:

    标签: wpf sorting datagrid virtualization data-virtualization


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      • 2011-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-30
      • 2014-08-02
      相关资源
      最近更新 更多