为何我的ObservableCollection无PropertyChanged事件?修改后仍未触发
解决ObservableCollection中对象属性变更不触发PropertyChanged的问题
你遇到的问题根源在于:ObservableCollection仅监听集合层面的变化(比如添加、删除元素),如果要让集合内对象的属性变更触发通知,对象所属的类必须实现INotifyPropertyChanged接口。你的ControlObjectsPropertyOnHold类只是普通类,属性变更时不会主动触发任何通知事件。
修改方案
让ControlObjectsPropertyOnHold实现INotifyPropertyChanged接口,并为每个需要监听变更的属性添加事件触发逻辑:
using System.ComponentModel; using System.Runtime.CompilerServices; public class ControlObjectsPropertyOnHold : INotifyPropertyChanged { private string _name; private Rhino.DocObjects.ObjRef _objRef; private System.Guid _objGuid; // 定义PropertyChanged事件 public event PropertyChangedEventHandler PropertyChanged; public string Name { get => _name; set { if (_name != value) { _name = value; // 触发属性变更通知 OnPropertyChanged(); } } } public Rhino.DocObjects.ObjRef ObjRef { get => _objRef; set { if (_objRef != value) { _objRef = value; OnPropertyChanged(); } } } public System.Guid ObjGuid { get => _objGuid; set { if (_objGuid != value) { _objGuid = value; OnPropertyChanged(); } } } public ControlObjectsPropertyOnHold(string name, Rhino.DocObjects.ObjRef objRef, System.Guid objGuid) { if (name != null) { _name = name; _objRef = objRef; _objGuid = objGuid; } } // 封装事件触发逻辑,[CallerMemberName]自动获取属性名 private void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
关键说明
- 实现
INotifyPropertyChanged接口后,每次属性值发生实际变化时,调用OnPropertyChanged触发事件 [CallerMemberName]特性可以避免手动写属性名,减少出错概率- 后续当你修改
ObservableCollection中ControlObjectsPropertyOnHold实例的Name等属性时,PropertyChanged事件会正常触发,绑定该属性的UI或监听逻辑就能收到通知
内容的提问来源于stack exchange,提问作者user11095285
相关产品推荐
相关产品推荐

