RadGridView跨控件选中同步问题:选中项无法自动滚动定位
解决RadGridView选中项后自动滚动到视图的问题
你已经完成了两个RadGridView的选中项同步逻辑,但RadGridView的SelectedItem属性只会标记行的选中状态,不会自动触发滚动到可见区域的操作,这就是为什么你需要手动滚动才能看到选中行的原因。下面给你两种可行的实现方案,结合你的分组场景来处理:
方案一:直接在View的后台代码处理(简单直接)
这种方式适合同一窗口内的控件交互,不需要复杂的MVVM消息传递:
- 首先在GridView2的XAML中添加
SelectedItemChanged事件绑定:
<telerik:RadGridView x:Name="GridView2" SelectedItem="{Binding SelectedDP1}" SelectedItemChanged="GridView2_SelectedItemChanged" <!-- 你的其他属性 --> />
- 在窗口的后台代码(.xaml.cs)中实现事件处理逻辑,这里我们会先展开选中项所在的分组(如果分组是折叠的),再滚动到选中行:
private async void GridView2_SelectedItemChanged(object sender, Telerik.Windows.Controls.SelectionChangeEventArgs e) { var gridView = sender as Telerik.Windows.Controls.RadGridView; if (gridView?.SelectedItem == null) return; // 先找到选中项所在的分组行,展开它(如果是折叠状态) var groupRow = gridView.Items.Cast<object>() .FirstOrDefault(item => item is Telerik.Windows.Controls.GridViewGroupRow groupItem && groupItem.Items.Contains(gridView.SelectedItem)) as Telerik.Windows.Controls.GridViewGroupRow; if (groupRow != null && !groupRow.IsExpanded) { groupRow.IsExpanded = true; // 给UI一点时间展开分组,再执行滚动 await Task.Delay(50); } // 异步滚动到选中项,确保操作在UI线程执行,避免卡顿 await gridView.ScrollIntoViewAsync(gridView.SelectedItem); }
方案二:MVVM友好的消息传递方式(适合解耦场景)
如果你的ViewModel和View是完全分离的,不想让ViewModel直接依赖UI控件,可以用MVVM框架的消息机制(比如MVVM Light的Messenger)来通知View执行滚动:
- 在ViewModel的
SelectedDP1属性setter中发送滚动通知:
private SecurityDataPermissions mSelectedDP1 = new SecurityDataPermissions(); public SecurityDataPermissions SelectedDP1 { get { return mSelectedDP1; } set { this.mSelectedDP1 = value; OnPropertyChanged("SelectedDP1"); // 发送消息通知View滚动到当前选中项 Messenger.Default.Send(mSelectedDP1); } }
- 在View的后台代码中注册消息并处理滚动逻辑:
public YourWindow() { InitializeComponent(); // 注册消息监听 Messenger.Default.Register<SecurityDataPermissions>(this, async selectedItem => { if (selectedItem == null || GridView2 == null) return; // 展开选中项所在分组 var groupRow = GridView2.Items.Cast<object>() .FirstOrDefault(item => item is Telerik.Windows.Controls.GridViewGroupRow groupItem && groupItem.Items.Contains(selectedItem)) as Telerik.Windows.Controls.GridViewGroupRow; if (groupRow != null && !groupRow.IsExpanded) { groupRow.IsExpanded = true; await Task.Delay(50); } // 滚动到选中项 await GridView2.ScrollIntoViewAsync(selectedItem); }); }
关键说明
- 用
ScrollIntoViewAsync而不是同步的ScrollIntoView,是因为异步方法会在UI线程空闲时执行,避免界面卡顿; - 因为你的GridView2是分组的,必须先展开选中项所在的分组,否则滚动操作可能无法定位到目标行(因为行在折叠的分组里不可见);
- 如果你没有使用MVVM Light,也可以用Prism的
EventAggregator或者自己实现简单的消息传递机制,核心逻辑都是通知View执行滚动和分组展开操作。
内容的提问来源于stack exchange,提问作者Alaa'
相关产品推荐
相关产品推荐

