我将对象值数据绑定到标签,它不会刷新。
lblTime.DataBindings.Add(new Binding("Text", AppSettings.Instance.SelectedAuction, "EndDate", false, DataSourceUpdateMode.OnPropertyChanged));
绑定工作并使用消息框,我知道值正在改变。我正确使用INotifyChanged但它无法正常工作。 改变个人价值观,比如说:
AppSettings.Instance.SelectedAuction.EndDate = ((Auction)lbAuctions.SelectedItem).EndDate;
但我想替换整个对象,它不会更新:
AppSettings.Instance.SelectedAuction = (Auction)lbAuctions.SelectedItem;
这是为什么?我可以刷新单个值,但不能刷新对象本身......
public Auction SelectedAuction
{
get { return this.selectedAuction; }
set
{
this.CheckPropertyChanged<Auction>
("SelectedAuction", ref this.selectedAuction, ref value);
}
}
是否有替换对象本身时需要使用的另一种方法或需要参考的其他方法?
答案 0 :(得分:1)
在调用lblTime
时,AppSettings.Instance.SelectedAuction
上的AddBinding
上的对象引用上设置了PropertyChanged
上设置的数据绑定。数据绑定订阅该对象上的SelectedAuction
事件。更改Instance
上的CurrentAuction
不会改变这一点。数据绑定仍在原始对象上订阅。 (这也意味着你有一个内存引导,因为数据绑定引用了原始Instance
,该实例不会被垃圾回收)
您需要设置数据绑定,以便列出"CurrentAuction.EndDate"
对象上的事件。您必须将绑定设置为BindingSource bs = new BindingSource();
bs.DataSource = AppSettings.Instance;
lblTime.DataBindings.Add("Text", bs, "CurrentAuction.EndDate", false,
DataSourceUpdateMode.OnPropertyChanged);
。这不会直接起作用(*见下面的注释),但是有一个辅助对象BindingSource,可以放在支持该绑定的中间。以下是一个例子:
BindingSource
注意:它在3.5中没有{{1}}但在4.0中没有,请参阅Does data binding support nested properties in Windows Forms?