取消选择行详细模板后调整数据网格高度

5

我正在使用RowDetailsTemplate来显示嵌套的数据网格。现在,当我选择一行以显示这个嵌套的数据网格时,它会展开高度。但是当取消选择该行时,它不会减少其高度。

  1. 是否有一种方法可以在行详细信息折叠后将数据网格调整回其原始高度?

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

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>

这对我有用。

1
发现了一个解决这个问题的方法:在网格选择更改事件上触发网格项的刷新,这会导致网格重新绘制自己。
    private void dgVehicles_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        DataGrid dg = sender as DataGrid;
        if (dg != null)
        {
            dg.Items.Refresh();
        }
        e.Handled = true;
    }

这对我有用。希望能帮到你。


0

注意:如果您需要嵌套的 DataGrid 具有独立滚动,则此方法不适用于您。这个细节在 OP 的问题中没有提到。

我知道这是一个旧帖子,但我在寻找解决我的问题的方法时偶然发现了它,并认为其他人可能会喜欢看到我找到的内容。我没有尝试 HolaJan 建议的行为方法,因为我正在寻找我认为更清洁的解决方案来解决我的问题。话虽如此,我确实在 MSDN 论坛上找到了一篇文章,介绍了在 DataGrid 上声明使用 ScrollViewer.CanContentScroll="False" 的方法。

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

答案在标记的答案中,是:
“我似乎通过设置一个完全无关的设置解决了这个问题。”

在我的子网格中,我将ScrollViewer.CanContentScroll设置为True。一旦我在所有子Grid中将其设置为False,它似乎神奇地工作了。现在,当我折叠行详细信息时,它会适当地调整包含行的大小。

-1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接