首页 文章

WPF DataGrid v fast,分组v慢 . 如何在不使用分组的情况下显示组行

提问于
浏览
4

我有一个WPF DataGrid,它显示的数据集超过60列,行数高达10000 . DataGrid加载完整的数据集 very quickly 并很好地处理它们 .

colA colB colC colD colE ... 

 1    2     3    4    5  
 5    6     7    8    9
 2    3     4    3    4  
 1    2     3    4    5  
 5    6     7    8    9
 2    3     4    3    4

但是,行被分成组 . 我需要显示一个组头,它是一个文本字符串,并且能够展开/折叠组 .

我可以为DataGrid使用分组 looks fine 但是 incredibly slow 最初显示大组 .

colA colB colC colD colE ... 
^ group title A
  1    2     3    4    5  
  5    6     7    8    9
  2    3     4    3    4  
^ group title B
  1    2     3    4    5  
  5    6     7    8    9
  2    3     4    3    4

我可以通过添加一个包含组描述的额外列来自己在DataGrid外部进行分组 . 然后,我可以通过更改提供给网格的数据集来折叠/展开任何组 . 那是 very fast ,但是 looks rubbish 因为它浪费了很多空间,特别是长队冠军 .

group          colA colB colC colD colE ...  
 group title A
                1    2     3    4    5  
                5    6     7    8    9
                2    3     4    3    4  
 group title B
                1    2     3    4    5  
                5    6     7    8    9
                2    3     4    3    4

我想要的是两个世界中最好的,即 fast and pretty ,能够像DataGrid分组一样显示数据,但是在外部进行分组 .

colA colB colC colD colE ... 
 ^ Very long comment about the data ...
   1    2     3    4    5  
   5    6     7    8    9   
   2    3     4    3    4  
 ^ Another arbitrarily long comment...
   1    2     3    4    5  
   5    6     7    8    9  
   2    3     4    3    4

知道如何以这种方式显示我的组头吗?

3 回答

  • 1

    它可能最初加载速度快,因为它使用虚拟化 . 这意味着它只加载屏幕上的可见项,而不是所有10000行和60列 . 我猜测,当分组它必须加载所有这就是你遇到减速的原因 .

    要修复它,我可能会调查创建自己的控件(使用虚拟化)并事先对数据进行分组 . 也许将ItemsControl绑定到分组数据,包括扩展器,当组扩展时,只获取该组的数据并将其加载到另一个itemscontrol中 . 您可以使用Grid.IsSharedScopeSize和SharedSizeGroup来保持列宽一致 .

  • 1

    我现在正在研究这个完全相同的问题 . WPF Datagrid在分组时无法虚拟化,因为这是用于表示组的Expander控件的限制,组本身无法虚拟化(因为使用ItemsPresenter,而不是ItemsControl) .

    A workaround is this(在ViewModel的帮助下向下滚动到Fake分组) . 在此博客文章中,作者通过将数据层次结构和组 Headers 呈现为自定义样式行来实现viewmodel中的组 . 所以它的所有行 - 本身没有扩展器或组 . 这可能允许您虚拟化并获得所需的性能 .

    我正在调查这个 .

  • 0

    这是一个老问题,但我在这里添加答案以供将来参考:


    自.Net 4.5以来,微软已经添加了 IsVirtualizingWhenGrouping 属性 . 将 DataGrid 的此属性设置为 True 可以解决此问题 .

    <DataGrid VirtualizingPanel.IsVirtualizingWhenGrouping="True">
    

    资料来源:This blog

相关问题