[英]C# Databound Label wont refresh
我将一个对象值绑定到标签,它不会刷新。
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);
}
}
是在替换对象本身时使用另一种方法还是我需要参考的其他方法?
在lblTime
上设置的数据绑定是在调用AddBinding
时通过AppSettings.Instance.SelectedAuction
在对象引用上设置的。 数据绑定订阅该对象上的PropertyChanged
事件。 更改Instance
上的SelectedAuction
不会改变它。 数据绑定仍在原始对象上订阅。 (这也意味着您有一条内存条,因为数据绑定引用了原始的CurrentAuction
,所以该实例将不会被垃圾回收)
您需要改为设置数据绑定,以便可以为Instance
对象上的事件列出数据绑定。 您必须将绑定设置为"CurrentAuction.EndDate"
。 这将不能直接工作(*请参阅下面的注释),但是可以在中间放置一个辅助对象BindingSource ,它将支持该绑定。 下面是一个示例:
BindingSource bs = new BindingSource();
bs.DataSource = AppSettings.Instance;
lblTime.DataBindings.Add("Text", bs, "CurrentAuction.EndDate", false,
DataSourceUpdateMode.OnPropertyChanged);
注意:在3.5中没有BindingSource
情况下将可以使用,但在4.0中则不能使用,请参阅数据绑定是否支持Windows窗体中的嵌套属性?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.