如何在WPF中检索DataGrid内容的总高度?

我有一个数据网格:

 

我想将元素的高度绑定到数据网格的高度。 简单地做{Binding ElementName=Foo, Path=ActualHeight}将不起作用,因为它取得了ScrollViewer的高度,而不是数据网格内容的总高度。

您需要找到DataGrid的内部ScrollViewer ,并绑定到它的ViewportHeight

根据您使用此值以及您需要的位置,可以通过多种方式完成此操作。

通常这种事情只是为了View-Only目的,所以我会把代码放在CodeBehind中查找ViewPort高度

例如,使用一些VisualTreeHelpers ,您可以执行以下操作:

 // Find first child of type ScrollViewer in object Foo var scrollViewer = VisualTreeHelpers.FindChild(Foo); // If object is found, set other control's height to ViewportHeight if (scrollViewer != null) { MyControl.Height = scrollViewer.ViewportHeight; } 

我不记得DataGrid是否有多个ScrollViewer ……你必须使用像Snoop这样的东西才能确定。 如果存在,则.FindChild()会超载以查找您应该能够使用的名称元素。 这个名字也可以通过像Snoop这样的东西获得。

这也可以在Converter完成,您将DataGrid传递给转换器,并让它在转换器中找到ScrollViewerViewportHeight

  

编辑

我实际上做了一些测试,DataGrid的ScrollViewer对大小的处理有点不同,可能是由于Virtualization 。 它似乎使用基于行数的相对大小。

我正在使用的测试DataGrid有23行。 ScrollViewer.ExtentHeight等于23, ScrollViewer.ViewportHeight为3,意味着总共有23行,并且显示了3个完整的行。 ScrollViewer.ScrollableHeight等于20,这意味着我可以从0滚动到20(因为显示了3个项目,它不需要转到23),并且ScrollViewer.VerticalOffset被设置为我当前滚动到的任何项目。

因此,为了获得虚拟化ScrollViewer中项目的实际内容高度,我认为您必须获取其中一个可见行的ActualHeight ,并将其乘以ScrollViewer.ExtentHeight以获取内容的实际大小。 这仅适用于所有物品的Height相同的情况。

您可以将DataGrid包装在另一个ScrollViewer ,然后DataGrid的实际高度将是正确的。

然而,这会带来性能损失,无法利用DataGrid行虚拟化 。 您必须测试并查看这是否会对您的用例产生重大负面影响。