WPF DataGrid实现仅展开单行RowDetails的技术咨询
WPF DataGrid 实现单行详情展开(自动关闭其他行)
要实现点击按钮展开当前行详情时自动关闭其他已展开的行,只需在原有点击事件逻辑中添加遍历并关闭非当前行详情的步骤,具体实现如下:
修改后的按钮点击事件代码
private void ButtonShowHide_Click(object sender, RoutedEventArgs e) { // 从视觉树中定位当前点击的DataGridRow DataGridRow currentRow = null; for (var vis = sender as Visual; vis != null; vis = VisualTreeHelper.GetParent(vis) as Visual) { if (vis is DataGridRow row) { currentRow = row; break; } } if (currentRow == null) return; // 找到当前行所属的DataGrid控件 var dataGrid = FindVisualParent<DataGrid>(currentRow); if (dataGrid == null) return; // 遍历所有行,关闭非当前行的详情面板 foreach (var item in dataGrid.Items) { if (dataGrid.ItemContainerGenerator.ContainerFromItem(item) is DataGridRow row && row != currentRow) { row.DetailsVisibility = Visibility.Collapsed; } } // 切换当前行的详情显隐状态 currentRow.DetailsVisibility = currentRow.DetailsVisibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible; } // 辅助方法:向上查找指定类型的视觉父控件 private T FindVisualParent<T>(DependencyObject child) where T : DependencyObject { var parent = VisualTreeHelper.GetParent(child); if (parent == null) return null; return parent is T target ? target : FindVisualParent<T>(parent); }
逻辑说明
- 定位当前行:通过视觉树向上遍历,找到触发按钮所在的
DataGridRow。 - 关联DataGrid:通过辅助方法找到当前行所属的
DataGrid控件,方便后续遍历所有行。 - 关闭其他行详情:遍历DataGrid的所有数据项,将对应行(排除当前行)的
DetailsVisibility统一设为Collapsed。 - 切换当前行状态:最后切换当前行的详情显隐,实现点击展开当前行时自动关闭其他行,再次点击则折叠当前行。
内容的提问来源于stack exchange,提问作者Julian2005
相关产品推荐
相关产品推荐

