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

WPF嵌套RadGridView选中状态异常问题求助

解决嵌套RadGridView跨子网格选中状态异常的问题

你遇到的这个问题是Telerik RadGridView嵌套场景下的常见行为——默认情况下,每个子网格的选中状态是独立维护的,控件不会自动跨子网格同步选中状态,也不会在切换子网格时清除之前的选中高亮,同时SelectedNestedItem属性只会在同一子网格内切换选中项时触发get/set。下面给你几个针对性的解决方法:


1. 切换父行时清除旧子网格的选中状态

当用户展开新的父行、折叠旧父行时,手动找到旧子网格并清除它的选中项,避免残留高亮。

后台代码实现:

// 记录当前展开的父行
private GridViewRowInfo _currentExpandedRow;

private void RadGridView1_RowIsExpandedChanged(object sender, RowIsExpandedChangedEventArgs e)
{
    // 如果之前有展开的父行,且不是当前行,清除其子网格的选中状态
    if (_currentExpandedRow != null && _currentExpandedRow != e.Row)
    {
        var oldNestedGrid = _currentExpandedRow.ChildRows.FirstOrDefault()?.ChildGridViewTemplate?.GridView as RadGridView;
        oldNestedGrid?.ClearSelection();
    }

    // 更新当前展开的父行记录
    _currentExpandedRow = e.IsExpanded ? e.Row : null;
}

XAML绑定事件:

在父RadGridView上绑定RowIsExpandedChanged事件:

<telerik:RadGridView x:Name="parentGridView" 
                     RowIsExpandedChanged="RadGridView1_RowIsExpandedChanged">
    <!-- 父网格列定义 -->
    <telerik:RadGridView.ChildGridViewTemplates>
        <telerik:GridViewTemplate>
            <!-- 子网格列定义 -->
        </telerik:GridViewTemplate>
    </telerik:RadGridView.ChildGridViewTemplates>
</telerik:RadGridView>

2. 强制触发SelectedNestedItem的属性变更

跨子网格选中项时,手动先将SelectedNestedItem设为null,再赋值新选中项,确保get/set方法被触发。

子网格SelectionChanged事件处理:

private void NestedGridView_SelectionChanged(object sender, GridViewSelectionChangedEventArgs e)
{
    var nestedGrid = sender as RadGridView;
    if (nestedGrid?.SelectedRows.Count == 0) return;

    var newSelectedItem = nestedGrid.SelectedRows.First().DataBoundItem;

    // 跨子网格选中时,先重置SelectedNestedItem
    if (SelectedNestedItem != null && !ReferenceEquals(SelectedNestedItem, newSelectedItem))
    {
        SelectedNestedItem = null;
    }

    SelectedNestedItem = newSelectedItem;
}

XAML绑定子网格事件:

在子GridViewTemplate中绑定SelectionChanged事件:

<telerik:GridViewTemplate>
    <telerik:RadGridView SelectionChanged="NestedGridView_SelectionChanged">
        <!-- 子网格列定义 -->
    </telerik:RadGridView>
</telerik:GridViewTemplate>

3. MVVM模式下的处理方案

如果用MVVM架构,你可以在ViewModel中维护SelectedNestedItem属性,同时给每个子网格绑定SelectedItem到ViewModel的临时属性,监听临时属性变化来同步:

private object _tempNestedSelectedItem;
public object TempNestedSelectedItem
{
    get => _tempNestedSelectedItem;
    set
    {
        if (SetProperty(ref _tempNestedSelectedItem, value))
        {
            // 跨子网格时先重置
            if (SelectedNestedItem != null && !ReferenceEquals(SelectedNestedItem, value))
            {
                SelectedNestedItem = null;
            }
            SelectedNestedItem = value;
        }
    }
}

private object _selectedNestedItem;
public object SelectedNestedItem
{
    get => _selectedNestedItem;
    set => SetProperty(ref _selectedNestedItem, value);
}

然后在XAML中给子网格绑定SelectedItem:

<telerik:GridViewTemplate>
    <telerik:RadGridView SelectedItem="{Binding DataContext.TempNestedSelectedItem, RelativeSource={RelativeSource AncestorType=telerik:RadGridView}}">
        <!-- 子网格列定义 -->
    </telerik:RadGridView>
</telerik:GridViewTemplate>

这些方法可以解决你遇到的两个核心问题:跨子网格时清除旧选中项的高亮,以及确保SelectedNestedItem的get/set在跨子网格选中时被触发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:44:16