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

如何实时跟踪Student模型IsSelected属性变化并维护选中ID列表

实现CheckBox勾选时实时更新SelectedIds列表

问题背景

现有代码已实现学生列表展示与勾选功能,需在勾选/取消勾选CheckBox时,实时将对应学生的Id添加/移除到SelectedIds列表中。

解决方案

步骤1:初始化SelectedIds列表

在ViewModel构造函数中完成SelectedIds的初始化,避免空引用:

public YourViewModel()
{
    SelectedIds = new List<Guid>();
}

步骤2:监听Student的IsSelected属性变化

在ViewModel的OnActivatedAsync方法加载数据后,给每个Student对象订阅PropertyChanged事件,监听IsSelected的变更:

public override async Task OnActivatedAsync()
{
    var results = await _service.GetAllStudents(take: 100);
    Students.ReplaceRange(results);
    
    // 为每个学生订阅属性变更事件
    foreach (var student in Students)
    {
        student.PropertyChanged += Student_PropertyChanged;
    }
}

// 处理IsSelected变更的事件逻辑
private void Student_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName != nameof(Student.IsSelected)) return;
    
    var student = sender as Student;
    if (student == null) return;
    
    if (student.IsSelected)
    {
        if (!SelectedIds.Contains(student.Id))
        {
            SelectedIds.Add(student.Id);
        }
    }
    else
    {
        SelectedIds.Remove(student.Id);
    }
}

步骤3:清理事件订阅(推荐)

为避免内存泄漏,在ViewModel的OnDeactivatedAsync方法中取消事件订阅:

public override async Task OnDeactivatedAsync()
{
    foreach (var student in Students)
    {
        student.PropertyChanged -= Student_PropertyChanged;
    }
    await base.OnDeactivatedAsync();
}

备选方案:自定义IsSelected变更事件

若不想依赖PropertyChanged事件,可在Student模型中添加自定义事件:

public class Student : BindableBase
{
    public Guid Id { get; set; }
    public string Fullname { get; set; }
    
    // 自定义选中状态变更事件
    public event Action<Student, bool> IsSelectedChanged;
    
    private bool _isSelected;
    public bool IsSelected 
    { 
        get => _isSelected; 
        set 
        {
            if (SetProperty(ref _isSelected, value))
            {
                IsSelectedChanged?.Invoke(this, value);
            }
        }
    }
}

ViewModel中订阅该自定义事件:

public override async Task OnActivatedAsync()
{
    var results = await _service.GetAllStudents(take: 100);
    Students.ReplaceRange(results);
    
    foreach (var student in Students)
    {
        student.IsSelectedChanged += Student_IsSelectedChanged;
    }
}

private void Student_IsSelectedChanged(Student student, bool isSelected)
{
    if (isSelected)
    {
        if (!SelectedIds.Contains(student.Id))
        {
            SelectedIds.Add(student.Id);
        }
    }
    else
    {
        SelectedIds.Remove(student.Id);
    }
}

同样在OnDeactivatedAsync中取消订阅:

public override async Task OnDeactivatedAsync()
{
    foreach (var student in Students)
    {
        student.IsSelectedChanged -= Student_IsSelectedChanged;
    }
    await base.OnDeactivatedAsync();
}

额外提示

  • 若Students集合后续会动态增删元素,需监听集合的CollectionChanged事件,为新增学生订阅事件、为移除的学生取消订阅。
  • 若需UI实时绑定选中ID列表,可将SelectedIds改为ObservableCollection<Guid>。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:31:17