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

Xamarin MVVM:ObservableCollection中项属性变更时调用方法的实现

解决集合内对象属性变化时触发排序方法的问题

要实现当PersonList中任意Person对象的属性(如Age)变化时自动调用OrderList方法,核心是要监听每个Person对象的PropertyChanged事件,同时处理集合元素新增/移除时的事件绑定与解绑(避免内存泄漏)。

步骤1:修改ViewModel,添加事件监听逻辑

更新PeopleViewModel,添加对集合和元素的事件监听逻辑:

public class PeopleViewModel : BaseViewModel
{
    public ObservableCollection<Person> PersonList { get; set; }

    public PeopleViewModel()
    {
        PersonList = new ObservableCollection<Person>
        {
            new Person{ Name = "John", Age = 21},
            new Person{ Name = "Mary", Age = 15},
            new Person{ Name = "Steve", Age = 42},
            new Person{ Name = "Marik", Age = 23},
        };

        // 给初始集合中的每个Person绑定PropertyChanged事件
        foreach (var person in PersonList)
        {
            person.PropertyChanged += Person_PropertyChanged;
        }

        // 监听集合的增删变化,动态绑定/解绑事件
        PersonList.CollectionChanged += PersonList_CollectionChanged;
    }

    private void PersonList_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        // 给新增元素绑定事件
        if (e.NewItems != null)
        {
            foreach (Person newPerson in e.NewItems)
            {
                newPerson.PropertyChanged += Person_PropertyChanged;
            }
        }

        // 给移除元素解绑事件,避免内存泄漏
        if (e.OldItems != null)
        {
            foreach (Person oldPerson in e.OldItems)
            {
                oldPerson.PropertyChanged -= Person_PropertyChanged;
            }
        }
    }

    private void Person_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        // 可选:仅当Age属性变化时触发排序
        // if (e.PropertyName == nameof(Person.Age))
        // {
            OrderList();
        // }
    }

    void OrderList()
    {
        var sortedList = PersonList.OrderBy(x => x.Age).ToList();

        PersonList.Clear();
        foreach (var item in sortedList)
        {
            PersonList.Add(item);
        }
    }
}

关键说明

  • 集合变化监听:通过ObservableCollection的CollectionChanged事件,在元素新增时绑定PropertyChanged,移除时解绑,防止内存泄漏。
  • 属性变化触发:每个Person对象的属性变化时,会触发Person_PropertyChanged方法,进而调用OrderList。如果只需要特定属性(如Age)变化时触发,取消注释代码中的判断逻辑即可。
  • 方法名一致性:注意你的NotifyBase类中事件触发方法是Notificar,但Person类中调用的是Notify(),需要保持方法名一致,否则属性变化不会触发事件(建议统一为NotifyPropertyChanged)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:39:34