Fody.PropertyChanged:手动触发RaisePropertyChanged时DependsOn属性失效
解决Fody.PropertyChanged手动触发RaisePropertyChanged时[DependsOn]属性不更新的问题
问题原因
Fody.PropertyChanged的[DependsOn]逻辑是编译时织入到属性setter方法中的:当你通过属性setter赋值时,Fody会自动注入代码,触发当前属性以及所有标记了[DependsOn]的关联属性的PropertyChanged事件。但如果直接修改底层字段再手动调用RaisePropertyChanged,并没有走属性的setter流程,Fody的自动关联逻辑不会生效,因此只有原属性会触发通知,依赖属性不会更新。
解决方案
1. 优先使用属性setter赋值(推荐)
这是Fody.PropertyChanged的设计预期用法,直接通过属性赋值,Fody会自动处理所有依赖属性的通知逻辑,无需手动操作:
public void SetDeviceStateTo(DeviceStates deviceState) { DeviceState = deviceState; // Fody自动触发DeviceState和IsBusy的PropertyChanged事件 }
2. 必须修改底层字段时,手动触发依赖属性的通知
如果因为特殊场景必须直接修改底层字段,需要在触发原属性通知后,手动调用RaisePropertyChanged触发所有依赖属性的事件:
public void SetDeviceStateToAndRaisePropertyChangedAfterwards(DeviceStates deviceState) { _DeviceState = deviceState; RaisePropertyChanged(nameof(DeviceState)); RaisePropertyChanged(nameof(IsBusy)); // 手动触发依赖属性的更新 }
3. 移除冗余的INotifyPropertyChanged手动实现
你当前的代码中手动实现了INotifyPropertyChanged接口、PropertyChanged事件和RaisePropertyChanged方法,但已经添加了[PropertyChanged.AddINotifyPropertyChangedInterface]特性,Fody会自动为类生成这些代码,手动实现可能导致逻辑冲突或冗余。建议移除手动实现的部分,简化代码:
using System.ComponentModel; namespace FodyPropertyChanged { [PropertyChanged.AddINotifyPropertyChangedInterface] public class MainWindowViewModel { private DeviceStates _DeviceState; public DeviceStates DeviceState { get { return _DeviceState; } set { _DeviceState = value; } } [PropertyChanged.DependsOn(nameof(DeviceState))] public bool IsBusy { get { return DeviceState == DeviceStates.Working; } } public void SetDeviceStateTo(DeviceStates deviceState) { DeviceState = deviceState; } public void SetDeviceStateToAndRaisePropertyChangedAfterwards(DeviceStates deviceState) { _DeviceState = deviceState; RaisePropertyChanged(nameof(DeviceState)); RaisePropertyChanged(nameof(IsBusy)); } } }
内容的提问来源于stack exchange,提问作者jauchand
相关产品推荐
相关产品推荐

