Xamarin.Forms更新后ObservableCollection的set与集合变更事件触发问题
问题描述
程序中使用列表展示数据,希望获取新信息时无需将ItemSource设为Null即可更新列表,因此采用推荐的ObservableCollection方案。初期使用Xamarin.Forms(5.0.0.2196)和Xamarin Essentials(1.7.0)时,调用ObservableCollection会触发get代码块,增删元素会触发set代码块,代码示例如下:
ObservableCollection<Class> list = new ObservableCollection<Class>(); public ObservableCollection<Class> List { get => list; set { {...} } }
但将Xamarin.Forms和Xamarin Essentials更新至最新版本后,ObservableCollection的set代码块不再触发。需要了解如何触发set代码或OnCollectionChanged代码,以及新的属性构造器编写方式。
解决方法
绑定集合变更事件
要监听集合内元素的增删变更,只需在页面ViewModel的构造函数中添加CollectionChanged事件绑定:
public PageVM { list.CollectionChanged += List_CollectionChanged; } private void List_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { // 此处编写集合变更后的处理逻辑,方法可通过按Tab键自动生成 {...} }
set代码块触发场景
当直接为整个ObservableCollection属性赋值时,会触发set代码块,示例如下:
ObservableCollection<string> list = new ObservableCollection<string> (); public ObservableCollection<string> List { get => list; set { list = value; {...} } } // 赋值操作会触发set代码块 ObservableCollection<string> List2 = new ObservableCollection<string> { "e", "f", "g" }; List = List2;
元素增删触发事件场景
使用.Add()或.Remove()方法修改集合内元素时,会触发CollectionChanged事件,示例如下:
// 添加元素触发集合变更事件 List.Add("g"); // 删除元素触发集合变更事件 List.Remove("a");
特殊场景处理
若在同一方法中先给ObservableCollection赋值,之后再增删元素,此时增删操作不会触发集合变更事件,需手动调用OnPropertyChanged(nameof(List))通知UI更新:
public void MethodThatChangesObservableObject() { List = List1; // 此处会触发set代码块 List.Add("w"); List.Remove("a"); // 此时添加和删除操作均不会触发集合变更事件 OnPropertyChanged(nameof(List)); // 手动通知Xamarin.Forms刷新UI }
注意:如果在List = List2;赋值操作之前增删ObservableCollection的元素,事件会正常触发;但同一方法中赋值后再修改集合,就需要手动调用上述方法通知UI更新。
内容的提问来源于stack exchange,提问作者Bryson

