5

RowDetailsTemplate を使用して、行のネストされたデータグリッドを表示しています。行を選択してこのネストされたデータグリッドを表示すると、データグリッドの高さが拡張されます。ただし、行が選択解除されても高さは減りません。

  1. 行の詳細が折りたたまれた後、データグリッドのサイズを元の高さに変更する方法はありますか?

  2. 宣言的に行うことは可能ですか?

4

4 に答える 4

2

この動作で StackPanel とグリッドに詳細を配置します。

public class DataGridDetailResizeBehavior : Behavior<FrameworkElement>
{
    protected override void OnAttached()
    {
        base.OnAttached();
        this.AssociatedObject.SizeChanged += new SizeChangedEventHandler(Element_SizeChanged);
    }

    protected override void OnDetaching()
    {
        this.AssociatedObject.SizeChanged -= new SizeChangedEventHandler(Element_SizeChanged);
        base.OnDetaching();
    }

    private void Element_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        //Find DataGridDetailsPresenter
        DataGridDetailsPresenter rowDetailPresenter = null;
        var element = this.AssociatedObject;
        while (element != null)
        {
            rowDetailPresenter = element as DataGridDetailsPresenter;
            if (rowDetailPresenter != null)
            {
                break;
            }

            element = (FrameworkElement)VisualTreeHelper.GetParent(element);
        } 

        if (rowDetailPresenter != null)
        {
            var row = UIHelper.GetParentOf<DataGridRow>(this.AssociatedObject);
            if (row != null && row.DetailsVisibility == Visibility.Visible)
            {
                //Set height
                rowDetailPresenter.ContentHeight = this.AssociatedObject.ActualHeight;
            }
        }
    }
}

XAML は次のようになります。

<sdk:DataGrid.RowDetailsTemplate>
    <DataTemplate>
        <StackPanel>
            <Grid>
                <sdk:DataGrid...

                <i:Interaction.Behaviors>
                    <myinteractivity:DataGridDetailResizeBehavior />
                </i:Interaction.Behaviors>
            </Grid>
        </StackPanel>
    </DataTemplate>
</sdk:DataGrid.RowDetailsTemplate>

これは私にとってはうまくいきました。

于 2011-12-25T19:49:59.767 に答える
1

この問題の回避策が見つかりました。グリッドの選択変更イベントで、グリッド項目のリフレッシュがトリガーされます。これにより、グリッド自体が再描画されます。

    private void dgVehicles_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        DataGrid dg = sender as DataGrid;
        if (dg != null)
        {
            dg.Items.Refresh();
        }
        e.Handled = true;
    }

これは私にとってはうまくいきました。それが役に立てば幸い。

于 2010-12-08T22:56:13.353 に答える
0

注:ネストされたものに独立したスクロールが必要な場合DataGrid、これは機能しません。その詳細は、OP の質問には記載されていません。

これが古いスレッドであることは認識していますが、問題を解決する方法を探しているときに偶然見つけて、他の人が私が見つけたものを見たいと思うかもしれないと思いました. 私は自分の問題に対するよりクリーンな解決策を探していたので、HolaJan によって提案された動作アプローチを試しませんでした。そうは言っても、MSDN フォーラムでScrollViewer.CanContentScroll="False"DataGrid.

私の解決策を見つけた投稿は次のとおりです

答えはマークされた答えにあり、
「まったく関係のない設定を設定することで問題を解決したようです。

私の子グリッドでは、にScrollViewer.CanContentScroll設定しましたTrue。すべての Child で False に設定するとGrid、魔法のように機能するように見えました。行の詳細を折りたたむと、含まれる行のサイズが適切に変更されます。」

于 2012-06-14T17:43:15.340 に答える
-1

をセットするDataGrid.VerticalAlignment = System.Windows.VerticalAlignment.Top

于 2010-12-22T22:05:11.847 に答える