0

我正在将对象值数据绑定到标签,它不会刷新。

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

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

4

1 回答 1

1

设置的数据绑定是在调用时lblTime在对象引用上设置的。数据绑定订阅该对象上的事件。改变你的并不会改变这一点。数据绑定仍然订阅原始对象。(这也意味着你有内存,因为数据绑定引用了原始的,该实例不会被垃圾收集)AppSettings.Instance.SelectedAuctionAddBindingPropertyChangedSelectedAuctionInstanceCurrentAuction

您需要设置数据绑定,以便它可以列出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 窗体中的嵌套属性吗?

于 2013-01-13T03:01:05.233 回答