3

私はデータグリッドを持っています:

<DataGrid x:Name="Foo" ... />

要素の高さをデータ グリッドの高さにバインドしたいと思います。データ グリッドのコンテンツの合計の高さではなく、 の高さ{Binding ElementName=Foo, Path=ActualHeight}を取るため、単純に実行するだけでは機能しません。ScrollViewer

4

2 に答える 2

2

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を見つけます。ScrollViewerViewportHeight

<Grid Height="{Binding ElementName=Foo, 
                       Converter={StaticResource GetDataGridContentHeight}}" />

編集

私は実際にいくつかのテストを行いました.DataGridのScrollViewerサイズは、おそらくVirtualization. 行数に基づいた相対的なサイズを使用しているようです。

私が扱っていたテストDataGridには23行ありました。ScrollViewer.ExtentHeightは 23 に等しく、 3 でした。これScrollViewer.ViewportHeightは、合計 23 行があり、3 つの完全な行が表示されていたことを意味します。はScrollViewer.ScrollableHeight20 に等しく、つまり 0 から 20 までスクロールでき (3 つの項目が表示されているため、23 に移動する必要はありません)、ScrollViewer.VerticalOffsetは現在スクロールされている項目に設定されていました。

したがって、仮想化されたアイテムの実際のコンテンツの高さを取得するには、表示されている行の 1 つScrollViewerを取得しActualHeight、それに を掛けてScrollViewer.ExtentHeightコンテンツの実際のサイズを取得する必要があると思います。Heightただし、これはすべてのアイテムが同じ場合にのみ機能します。

于 2012-06-22T14:12:33.047 に答える
0

DataGridを別のものにラップするScrollViewerと、DataGrid の実際の高さが正しくなります。

ただし、これには、の行仮想化を利用できないというパフォーマンス上のペナルティが伴いDataGridます。これがユースケースに重大な悪影響を与えるかどうかをテストして確認する必要があります。

于 2012-06-22T13:16:32.610 に答える