我知道DataGrid支持虚拟化,因此它仅为可见行创建网格单元。但是,这似乎仅在DataGrid的大小受限时才有效。
在我的场景中,DataGrid放在滚动查看器中,如此
<ScrollViever>
<StackPanel>
<more elements .../>
<DataGrid ... />
<more elements .../>
</StackPanel>
</ScrollViever>
这似乎打破了虚拟化。在DataGrid应显示大量项目的情况下,即使在外部ScrollViewer中向下滚动之前,可视化树也会变得非常大。
有没有办法阻止DataGrid预先创建所有单元格,而是在ScrollViewer向下滚动时创建它们?
编辑:基本上托管这个的页面应该像一个网页,顶部有一些文字,一个大表格,底部还有一些文字。而不是顶部/底部始终可见且仅滚动网格的dockview,整个页面应滚动。设置实现了这一点,但是受到预先创建的所有内容的影响。另一个编辑:有没有办法检测数据网格的特定行是否滚动到视图中?典型的延迟加载文章使用 datagrid的 scrollviewer将更多项添加到网格中,这在此处不起作用。
答案 0 :(得分:1)
是的,你有点回答了自己的问题。如果将DataGrid放在ScrollViewer或StackPanel或任何未将修复约束传递给DataGrid的控件中,它将破坏DataGrid中的虚拟化。
您可以通过提供DataGrid.Width和DataGrid.Height修复值来解决此问题。
您需要知道虚拟化的那些修复值。虚拟化需要修复祖先。
以下是如何为DataGrid提供修复大小:
只需将Height / Widht绑定到ScrollViewer或Grid。
<Grid x:Name="grid" >
<ScrollViever>
<StackPanel>
<more elements .../>
<DataGrid Width={Binding ElementName=grid, Path=Width..} Height={Binding ElementName...} />
<more elements .../>
</StackPanel>
</ScrollViever>
<Grid>
那就是它:)
答案 1 :(得分:0)
不要将它放在ScrollViewer中,只要它在那里就会伸展,这将是它的整体尺寸。