c#数据绑定标签不会刷新

本文关键字:刷新 标签 数据绑定 | 更新日期: 2023-09-27 17:52:49

我将一个对象值绑定到一个标签,它不会刷新。

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);
        }
    }

是否有另一种方法可以在替换对象本身或需要引用的其他东西时使用?

c#数据绑定标签不会刷新

lblTime上设置的数据绑定是在AppSettings.Instance.SelectedAuction调用AddBinding时在对象引用上设置的。数据绑定订阅该对象上的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);

注意:它将工作没有BindingSource在3.5,但不是在4.0,见数据绑定支持嵌套属性在Windows窗体?