2

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

在我的场景中,一个 DataGrid 被放置在一个滚动查看器中,就像这样

<ScrollViever>
    <StackPanel>

        <more elements .../>

        <DataGrid ... />

        <more elements .../>

    </StackPanel>
</ScrollViever>

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

有什么方法可以防止 DataGrid 预先创建所有单元格,而是在 ScrollViewer 向下滚动时创建它们?

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

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

4

2 回答 2

2

是的,你有点回答了你自己的问题。如果将 DataGrid 放置在 ScrollViewer 或 StackPanel 或任何未将修复约束传递给 DataGrid 的控件中,它将破坏 DataGrid 中的虚拟化。

您可以通过提供 DataGrid.Width 和 DataGrid.Height 固定值来解决此问题。

您需要知道虚拟化的那些修复值。虚拟化需要修复祖先。

以下是如何给 DataGrid 固定大小:

只需将高度/宽度绑定到 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>

就是这样:)

于 2013-12-06T12:01:45.287 回答
0

不要将它放在 ScrollViewer 中,它会在其中拉伸到它想要的长度,这将是它的整个大小。

于 2014-01-20T14:00:00.683 回答