在ScrollViewer中为WPF DataGrid使用虚拟化

时间:2013-12-06 09:34:01

标签: wpf datagrid virtualizingstackpanel

我知道DataGrid支持虚拟化,因此它仅为可见行创建网格单元。但是,这似乎仅在DataGrid的大小受限时才有效。

在我的场景中,DataGrid放在滚动查看器中,如此

<ScrollViever>
    <StackPanel>

        <more elements .../>

        <DataGrid ... />

        <more elements .../>

    </StackPanel>
</ScrollViever>

这似乎打破了虚拟化。在DataGrid应显示大量项目的情况下,即使在外部ScrollViewer中向下滚动之前,可视化树也会变得非常大。

有没有办法阻止DataGrid预先创建所有单元格,而是在ScrollViewer向下滚动时创建它们?

编辑:基本上托管这个的页面应该像一个网页,顶部有一些文字,一个大表格,底部还有一些文字。而不是顶部/底部始终可见且仅滚动网格的dockview,整个页面应滚动。设置实现了这一点,但是受到预先创建的所有内容的影响。

另一个编辑:有没有办法检测数据网格的特定行是否滚动到视图中?典型的延迟加载文章使用 datagrid的 scrollviewer将更多项添加到网格中,这在此处不起作用。

2 个答案:

答案 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中,只要它在那里就会伸展,这将是它的整体尺寸。