如何实时跟踪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
相关产品推荐
相关产品推荐

