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
相关产品推荐
相关产品推荐

