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

Avalonia DataGrid刷新后SelectedItem丢失,如何恢复选中项?

Avalonia DataGrid刷新集合后恢复选中项的解决方案

核心问题分析

刷新集合时如果直接替换整个ItemSource(比如重新赋值ObservableCollection),原来的SelectedItem会因为对象实例变更或集合重置变为null,且在SelectionChanged事件里直接设置会因为时机不对(比如集合还未完成更新)或触发循环事件导致失效。

具体解决步骤

1. 保存选中项的唯一标识

不要直接保存选中的对象实例(刷新后实例可能已替换),而是保存对象的唯一标识(比如ID),确保能在新集合中找到对应项。

2. 刷新集合后恢复选中项+焦点

集合更新完成后,通过唯一标识找到新集合中的目标项,设置SelectedItem并恢复DataGrid的焦点。

代码示例

后台代码(非MVVM场景)

// 记录上次选中项的ID
private int? _lastSelectedItemId;

// 刷新数据的方法
private async void RefreshButton_Click(object sender, RoutedEventArgs e)
{
    // 保存当前选中项的ID
    var currentSelected = MyDataGrid.SelectedItem as MyModel;
    _lastSelectedItemId = currentSelected?.Id;

    // 刷新集合(示例:重新获取数据)
    var newDataList = await YourDataService.GetLatestDataAsync();
    MyDataGrid.ItemsSource = new ObservableCollection<MyModel>(newDataList);

    // 恢复选中项
    var targetItem = newDataList.FirstOrDefault(item => item.Id == _lastSelectedItemId);
    if (targetItem != null)
    {
        MyDataGrid.SelectedItem = targetItem;
        // 恢复DataGrid焦点
        MyDataGrid.Focus();
        // 滚动到选中项,确保可见
        MyDataGrid.ScrollIntoView(targetItem);
    }
}

MVVM场景(ViewModel实现)

public class MainViewModel : ViewModelBase
{
    private ObservableCollection<MyModel> _myItems;
    public ObservableCollection<MyModel> MyItems
    {
        get => _myItems;
        set => SetProperty(ref _myItems, value);
    }

    private MyModel _selectedItem;
    public MyModel SelectedItem
    {
        get => _selectedItem;
        set => SetProperty(ref _selectedItem, value);
    }

    private int? _lastSelectedId;

    public async Task RefreshData()
    {
        // 保存选中项ID
        _lastSelectedId = SelectedItem?.Id;
        // 获取新数据
        var newData = await YourDataService.GetDataAsync();
        // 更新集合
        MyItems = new ObservableCollection<MyModel>(newData);
        // 匹配并恢复选中项
        SelectedItem = MyItems.FirstOrDefault(item => item.Id == _lastSelectedId);
    }
}

额外注意事项

  • 尽量避免直接替换整个ObservableCollection,如果只是更新部分数据,用Add/Remove/Replace方法修改现有集合,SelectedItem会自动保留(因为对象实例未变)。
  • 不要在SelectionChanged事件中设置SelectedItem,该事件会在集合刷新时触发(此时SelectedItem变为null),此时设置会和集合更新操作冲突,导致设置无效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 20:12:46