取消选择RowDetailsTemplate后调整Datagrid高度
我正在使用RowDetailsTemplate显示行的嵌套数据网格。 现在,当我选择一行来显示这个嵌套的datagrid时,datagrid的高度会扩展。 但是当取消选择行时,它不会降低其高度。
-
在折叠行详细信息后,有没有办法将数据网格大小调整为原始高度?
-
是否有可能以声明方式进行?
使用此行为将详细信息放入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