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
相关产品推荐
相关产品推荐

