You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 22:08:12