取消选择RowDetailsTemplate后调整Datagrid高度

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

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

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

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

public class DataGridDetailResizeBehavior : Behavior { 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(this.AssociatedObject); if (row != null && row.DetailsVisibility == Visibility.Visible) { //Set height rowDetailPresenter.ContentHeight = this.AssociatedObject.ActualHeight; } } } } 

和XAML看起来像这样:

            

这对我有用。

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

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

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

注意:如果您需要嵌套的DataGrid进行独立滚动,那么这对您不起作用。 OP的问题没有提到这个细节。

我意识到这是一个老线程,但我在寻找解决问题的方法时偶然发现它,并认为其他人可能希望看到我发现的东西。 我没有尝试HolaJan建议的行为方法,因为我在寻找一个更清晰的解决方案来解决我的问题。 这就是说我确实在MSDN论坛上找到了一条post,用于在DataGrid上以声明方式使用ScrollViewer.CanContentScroll="False"

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

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

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

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