如何在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
相关产品推荐
相关产品推荐

