私はデータグリッドを持っています:
<DataGrid x:Name="Foo" ... />
要素の高さをデータ グリッドの高さにバインドしたいと思います。データ グリッドのコンテンツの合計の高さではなく、 の高さ{Binding ElementName=Foo, Path=ActualHeight}
を取るため、単純に実行するだけでは機能しません。ScrollViewer
DataGrid の internal を見つけてScrollViewer
、それにバインドする必要がありますViewportHeight
この値を使用して何をしているか、および必要な場所に応じて、さまざまな方法でこれを行うことができます。
通常、この種のものはビューのみの目的で必要になるため、CodeBehind で ViewPort の高さを見つけるコードを配置します。
たとえば、いくつかのVisualTreeHelpersを使用すると、次のようなことができます。
// Find first child of type ScrollViewer in object Foo
var scrollViewer = VisualTreeHelpers.FindChild<ScrollViewer>(Foo);
// If object is found, set other control's height to ViewportHeight
if (scrollViewer != null)
{
MyControl.Height = scrollViewer.ViewportHeight;
}
複数ある場合は覚えていませんScrollViewer
...DataGrid
確実に調べるには、 Snoopなどを使用する必要があります。.FindChild()
存在する場合は、使用できるはずの名前で要素を見つけるためのオーバーロードがあります。名前はスヌープなどでも取得できます。
これは で行うこともできConverter
ます。ここでは、 をコンバーターに渡し、コンバーターでおよびDataGrid
を見つけます。ScrollViewer
ViewportHeight
<Grid Height="{Binding ElementName=Foo,
Converter={StaticResource GetDataGridContentHeight}}" />
編集
私は実際にいくつかのテストを行いました.DataGridのScrollViewer
サイズは、おそらくVirtualization
. 行数に基づいた相対的なサイズを使用しているようです。
私が扱っていたテストDataGrid
には23行ありました。ScrollViewer.ExtentHeight
は 23 に等しく、 3 でした。これScrollViewer.ViewportHeight
は、合計 23 行があり、3 つの完全な行が表示されていたことを意味します。はScrollViewer.ScrollableHeight
20 に等しく、つまり 0 から 20 までスクロールでき (3 つの項目が表示されているため、23 に移動する必要はありません)、ScrollViewer.VerticalOffset
は現在スクロールされている項目に設定されていました。
したがって、仮想化されたアイテムの実際のコンテンツの高さを取得するには、表示されている行の 1 つScrollViewer
を取得しActualHeight
、それに を掛けてScrollViewer.ExtentHeight
コンテンツの実際のサイズを取得する必要があると思います。Height
ただし、これはすべてのアイテムが同じ場合にのみ機能します。
DataGrid
を別のものにラップするScrollViewer
と、DataGrid の実際の高さが正しくなります。
ただし、これには、の行仮想化を利用できないというパフォーマンス上のペナルティが伴いDataGrid
ます。これがユースケースに重大な悪影響を与えるかどうかをテストして確認する必要があります。