如何在VendorValue或bonus_sell变化时触发WPF绑定的FinalPrice更新?
解决方案
要让FinalPrice在VendorValue或bonus_sell变化时自动更新WPF绑定显示,需要分别处理实例属性和静态变量的变更通知逻辑:
1. 处理VendorValue变化时的通知
在VendorValue的setter中,更新自身值后,除了触发自身的变更通知,还要额外触发FinalPrice的变更通知:
public int VendorValue { get { return vendorvalue; } set { vendorvalue = value; OnPropertyChanged(nameof(VendorValue)); // 通知绑定FinalPrice的控件更新值 OnPropertyChanged(nameof(FinalPrice)); } }
2. 处理静态变量bonus_sell变化时的通知
由于bonus_sell是所有Item实例共享的静态值,需要通过静态事件实现全局通知:
步骤1:添加静态属性变更事件
在Item类中补充静态版本的PropertyChanged事件及通知方法:
public class Item : INotifyPropertyChanged { // 实例级属性变更事件 public event PropertyChangedEventHandler PropertyChanged; // 静态属性变更事件,用于通知全局静态值变化 public static event PropertyChangedEventHandler StaticPropertyChanged; // 实例通知方法 protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } // 静态通知方法 protected static void OnStaticPropertyChanged([CallerMemberName] string propertyName = null) { StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(propertyName)); } // ... 原有其他代码 }
步骤2:将静态字段改为静态属性并触发通知
把原静态字段bonus_sell改为带setter的静态属性,在值变化时触发静态事件:
private static int _bonus_sell = 0; public static int BonusSell { get { return _bonus_sell; } set { _bonus_sell = value; OnStaticPropertyChanged(nameof(BonusSell)); } }
步骤3:让Item实例监听静态事件
在Item构造函数中订阅静态事件,当BonusSell变化时,触发实例的FinalPrice变更通知:
public Item() { StaticPropertyChanged += Item_StaticPropertyChanged; } private void Item_StaticPropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == nameof(BonusSell)) { OnPropertyChanged(nameof(FinalPrice)); } } // 可选:实现IDisposable取消订阅,避免内存泄漏 public void Dispose() { StaticPropertyChanged -= Item_StaticPropertyChanged; }
步骤4:更新FinalPrice的计算逻辑
将原代码中的bonus_sell替换为静态属性BonusSell:
public int FinalPrice { get { return VendorValue + BonusSell; } }
额外提示
- 使用
nameof()关键字替代硬编码属性名,避免后续重命名属性时出现错误。 - 如果
Item实例会被频繁创建销毁,建议实现IDisposable接口取消静态事件订阅,防止内存泄漏。
内容的提问来源于stack exchange,提问作者Ionnae
相关产品推荐
相关产品推荐

