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.

我找到解决方案的帖子位于:http ://social.msdn.microsoft.com/Forums/is/wpf/thread/a0e7aea8-e9ad-441f-a775-1178aab75fb0

答案在于标记的答案,并且是:
“我似乎通过设置一个完全不相关的设置解决了这个问题。

在我的子网格中,我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 回答