【问题标题】:C# Databound Label wont refreshC# 数据绑定标签不会刷新
【发布时间】:2012-12-27 07:36:10
【问题描述】:

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

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# data-binding refresh auto-update


    【解决方案1】:

    lblTime 上设置的数据绑定是在调用AddBinding 时由AppSettings.Instance.SelectedAuction 在对象引用上设置的。数据绑定订阅该对象上的PropertyChanged 事件。更改 SelectedAuction 上的 Instance 不会改变这一点。数据绑定仍然订阅原始对象。 (这也意味着你有内存,因为数据绑定引用了原始的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 中则不行,请参阅 Does data binding support nested properties in Windows Forms?

    【讨论】:

    • 谢谢 - 这感觉像是向前迈了一步,但它仍然不令人耳目一新。我有一个列表框,它以相同的方式显示带有数据源的列表 - 但这只是行不通......
    • 啊 - 工作。我的列表框索引更改事件已撤消?!再次设置它,它当然可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 2019-07-13
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多