我正在使用DataRepeater来显示屏幕上业务对象的数据。我在C#中使用Windows窗体来完成此任务。数据源在编译时不可用,因此我想在运行时绑定数据源。
以下是简化方案。我正在使用这个商务舱:
public class Product
{
private double _price;
public double Price
{
get
{
return _price;
}
set
{
_price = value;
}
}
}
我使用VisualStudio界面创建了一个ProductDataSource,并将价格绑定到标签上。现在我用代码填充了我的转发器的数据源:
dataRepeater1.DataSource = _productDataAgent.GetProducts();
当我启动我的应用程序时,价格正确填写在标签中。到现在为止还挺好。
现在我希望在更新产品时更新价格标签。 Visual Studio界面帮助我,让我选择“数据源更新模式”。所以我选择“OnPropertyChanged”。
这是棘手的部分。 .NET运行时如何知道price属性是从后端更新的。所以我修改我的业务类来实现INotifyPropertyChanged。像这样:
public class Product : INotifyPropertyChanged
{
private double _price;
public double Price
{
get
{
return _price;
}
set
{
_price = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Price"));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
问题是这不起作用。当我更新产品时,它在界面中重新记录未更新。当我调试并更改属性时,我看到PropertyChanged事件为null,因此没有人在监听。
深入研究问题我在MSDN上的System.Windows.Forms.Binding构造函数页面上找到了以下内容:
名为PropertyNameChanged的事件。
所以我尝试使用(自定义)PriceChanged事件,但这不起作用。
我在这里做错了吗?我正在使用WPF,所以也许这在Windows窗体中有点不同?这是因为我在运行时绑定了吗?
答案 0 :(得分:0)
private System.Windows.Forms.BindingSource beursProductDisplayBindingSource;
this.beursProductDisplayBindingSource = new System.Windows.Forms.BindingSource(this.components);
this.dataRepeater1.DataSource = this.beursProductDisplayBindingSource;
现在你可以像这样动态绑定:
BindingSource productBinding = ((BindingSource)dataRepeater1.DataSource);
_productDataAgent.BeursProducts.ForEach(product => productBinding.Add(product));
现在,在我的数据对象中实现INotifyPropertyChanged就像预期的那样工作。忘了使用WPF时不需要的一个步骤。