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

如何在BindingList<Package>中访问并修改Package对象的价格属性?

问题与解决方案

问题描述

我正尝试访问并修改BindingList<Package>集合中Package对象的属性值。我有一个存储Package对象的BindingList<Package>,每个Package的内饰关联对应香氛。我已编写通过switch语句获取选中香氛价格的方法,还有下拉框选中索引变更的事件处理器,希望据此更新Package的价格,但不知如何访问BindingList中每个Package的价格元素。

相关代码

初始化BindingList与Package对象

private BindingList<Package> packages;

Package standardPackage = new Package("Standard",7.5m,standardInterior,standardExterior);
Package deluxePackage = new Package("Deluxe",15,deluxeInterior,deluxeExterior);
Package executivePackage = new Package("Executive", 35, executiveInterior, executiveInterior);
Package luxuryPackage = new Package("Luxury",55,luxuryInterior,luxuryExterior);

this.packages.Add(standardPackage);
this.packages.Add(deluxePackage);
this.packages.Add(executivePackage);
this.packages.Add(luxuryPackage);

获取选中香氛价格的方法

private decimal Update_Price_With_Fragrance()
{
    decimal price = 0;
    string fragrance = this.fragrancesSource.Current.ToString();

    switch(fragrance)
    {
        case "Hawaiian Mist":
            price = 2.75m;
            break;

        case "Baby Powder":
            price = 1.5m;
            break;

        case "Country Floral":
            price = 2.25m;
            break;

        case "Pina Colada":
            price = .75m;
            break;

        case "Vanilla":
            price = 2.0m;
            break;
    }
    return price;
}

解决方案

1. 确保Package类实现INotifyPropertyChanged接口

要让UI自动感知Package属性的变化,Package类必须实现这个接口,否则修改属性后UI不会更新:

public class Package : INotifyPropertyChanged
{
    private string _name;
    private decimal _basePrice; // 存储原始基础价格,避免重复累加香氛价
    private decimal _price;
    // 其他属性:Interior、Exterior等

    public string Name
    {
        get => _name;
        set
        {
            _name = value;
            OnPropertyChanged(nameof(Name));
        }
    }

    public decimal BasePrice
    {
        get => _basePrice;
        set
        {
            _basePrice = value;
            OnPropertyChanged(nameof(BasePrice));
            UpdateFinalPrice();
        }
    }

    public decimal Price
    {
        get => _price;
        private set
        {
            _price = value;
            OnPropertyChanged(nameof(Price));
        }
    }

    // 构造函数
    public Package(string name, decimal basePrice, object interior, object exterior)
    {
        _name = name;
        _basePrice = basePrice;
        // 初始化其他属性
        UpdateFinalPrice();
    }

    // 更新最终价格的辅助方法
    public void UpdateFinalPrice(decimal fragrancePrice = 0)
    {
        Price = BasePrice + fragrancePrice;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

2. 在下拉框事件中遍历更新所有Package价格

在下拉框选中索引变更的事件处理器里,获取香氛价格后,遍历packages集合调用更新方法:

private void FragranceDropdown_SelectedIndexChanged(object sender, EventArgs e)
{
    decimal fragrancePrice = Update_Price_With_Fragrance();
    
    // 遍历BindingList,更新每个Package的最终价格
    foreach (var package in packages)
    {
        package.UpdateFinalPrice(fragrancePrice);
    }
}

关键说明

  • 新增BasePrice属性存储Package的原始基础价格,避免每次切换香氛时重复累加价格,保证价格计算准确。
  • BindingList<T>仅处理集合层面的变更通知(添加/移除元素),元素属性的变更通知依赖INotifyPropertyChanged接口,这样UI控件(如DataGridView)才能自动刷新显示最新价格。
  • 如果不需要保留基础价格,也可以直接修改Price属性,但要确保Price的setter触发OnPropertyChanged。

内容的提问来源于stack exchange,提问作者Donald Leschyshyn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:19:59