You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
}

逻辑说明

  1. 定位当前行:通过视觉树向上遍历,找到触发按钮所在的DataGridRow。
  2. 关联DataGrid:通过辅助方法找到当前行所属的DataGrid控件,方便后续遍历所有行。
  3. 关闭其他行详情:遍历DataGrid的所有数据项,将对应行(排除当前行)的DetailsVisibility统一设为Collapsed。
  4. 切换当前行状态:最后切换当前行的详情显隐,实现点击展开当前行时自动关闭其他行,再次点击则折叠当前行。

内容的提问来源于stack exchange,提问作者Julian2005

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 08:43:12