WPF中PropertyChangedEventHandler事件未触发问题咨询
问题原因及解决办法
核心问题
你手动订阅事件的实例,和当前UI绑定的实例可能不是同一个。
具体来说:
你先通过MyObservableClassInstance = new MyObservableClass()创建实例并触发DataContext的属性变更通知,随后订阅该实例的PropertyChanged事件。但如果之后任何代码重新给MyObservableClassInstance赋值了新的MyObservableClass对象,UI会自动绑定到新实例,但新实例并没有订阅OnMyObservableClassPropertyChanged方法,因此当复选框修改BooleanProperty时,新实例触发的事件没有对应的处理逻辑执行。
解决办法
办法一:在属性Setter中统一管理事件订阅
修改MyObservableClassInstance属性的Setter逻辑,在替换实例时自动取消旧实例的订阅、订阅新实例的事件,确保当前绑定的实例始终有事件监听:
private MyObservableClass _myClassInstance; public MyObservableClass MyObservableClassInstance { get { return _myClassInstance; } set { // 取消旧实例的事件订阅 if (_myClassInstance != null) { _myClassInstance.PropertyChanged -= OnMyObservableClassPropertyChanged; } _myClassInstance = value; // 订阅新实例的事件 if (_myClassInstance != null) { _myClassInstance.PropertyChanged += OnMyObservableClassPropertyChanged; } PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(MyObservableClassInstance))); } }
之后初始化只需赋值,无需手动订阅:
MyObservableClassInstance = new MyObservableClass();
办法二:固定实例引用,避免重新赋值
如果业务场景不需要替换MyObservableClassInstance的引用,直接在构造函数中初始化实例并订阅事件,同时限制属性的Setter访问权限:
private readonly MyObservableClass _myClassInstance; // 构造函数中初始化 public YourDataContextClass() { _myClassInstance = new MyObservableClass(); _myClassInstance.PropertyChanged += OnMyObservableClassPropertyChanged; } // 只暴露Getter,防止外部修改引用 public MyObservableClass MyObservableClassInstance { get { return _myClassInstance; } }
验证
采用上述任一方案后,当勾选/取消勾选复选框触发BooleanProperty的PropertyChanged事件时,OnMyObservableClassPropertyChanged方法会正常执行。
内容的提问来源于stack exchange,提问作者Peter Gruden
相关产品推荐
相关产品推荐

