取消选择RowDetailsTemplate后调整Datagrid高度

时间:2010-03-02 16:40:03

标签: c# wpf wpftoolkit wpfdatagrid

我正在使用RowDetailsTemplate来显示行的嵌套数据网格。现在,当我选择一行来显示这个嵌套的datagrid时,datagrid的高度会扩展。但是当取消选择行时,它不会降低它的高度。

  1. 有没有办法在折叠行详细信息后将数据网格大小调整为原始高度?

  2. 是否有可能以声明方式进行?

4 个答案:

答案 0 :(得分:2)

使用此行为将详细信息放入StackPanel和grid:

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>

这对我有用。

答案 1 :(得分:1)

找到解决这个问题的方法;在网格的选择更改事件触发刷新网格项目时,这会导致网格重绘。

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

这对我有用。希望它有所帮助。

答案 2 :(得分: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 Grid中将其设置为False,它似乎神奇地起作用。现在当我折叠我的行细节时,它会适当地调整包含行的大小。“

答案 3 :(得分:-1)

设置DataGrid.VerticalAlignment = System.Windows.VerticalAlignment.Top