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

RadGridView跨控件选中同步问题:选中项无法自动滚动定位

解决RadGridView选中项后自动滚动到视图的问题

你已经完成了两个RadGridView的选中项同步逻辑,但RadGridView的SelectedItem属性只会标记行的选中状态,不会自动触发滚动到可见区域的操作,这就是为什么你需要手动滚动才能看到选中行的原因。下面给你两种可行的实现方案,结合你的分组场景来处理:

方案一:直接在View的后台代码处理(简单直接)

这种方式适合同一窗口内的控件交互,不需要复杂的MVVM消息传递:

  1. 首先在GridView2的XAML中添加SelectedItemChanged事件绑定:
<telerik:RadGridView 
    x:Name="GridView2" 
    SelectedItem="{Binding SelectedDP1}" 
    SelectedItemChanged="GridView2_SelectedItemChanged"
    <!-- 你的其他属性 -->
/>
  1. 在窗口的后台代码(.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执行滚动:

  1. 在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);
    }
}
  1. 在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'

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:27:56