Bindingsource未订阅ValueChanged事件

时间:2016-05-02 18:37:54

标签: c# winforms data-binding bindingsource

我有一个自定义控件,其Value属性支持双向绑定,还有ValueChanged事件:

public event EventHandler ValueChanged;

[Bindable(BindableSupport.Yes, BindingDirection.TwoWay)]
public virtual MyObject Value
{
    get { return this.value; }
    set 
    {
        this.value = value;
        OnValueChanged(new EventArgs());
    }
}

private void OnValueChanged(EventArgs e)
{
    EventHandler handler = ValueChanged;
    if (handler != null)
        handler(this, e);
}

当放置在窗体上并且在设计器中设置数据绑定时,此控件可正常工作。 bindingsource正确地订阅事件,并相应地更新基础数据源。

现在,我通过执行以下操作动态创建控件:

MyControl ctl = new MyControl();
ctl.DataBindings.Add(new Binding("Value", this.bindingSource, "SomeField", true, DataSourceUpdateMode.OnPropertyChanged));

但是,通过执行此操作,bindingsource不会订阅ValueChanged事件。我检查了设计器生成的代码,并没有使bindingsource注册到事件。我假设将绑定添加到数据绑定应该这样做,但它没有。

这里可能缺少什么?

1 个答案:

答案 0 :(得分:0)

一切都很好。

数据绑定只是稍后发生 - 基本上是在第一次创建控件并使其可见时。顺便说一句,它是订阅源/目标事件的数据绑定基础结构。在这方面,绑定源是 - 以及任何其他数据源。

请注意,如果您的控件永远不会显示 - 例如驻留在非活动标签页中,则数据绑定将不会被初始化并且不起作用。我想这应该是某种优化,如果你不了解它(甚至知道它)会导致问题。

无论如何,如果你想确保你的ValueChanged事件是有线的,你可以改变这样的代码:

EventHandler valueChanged;
public event EventHandler ValueChanged
{
    add { valueChanged += value; }
    remove { valueChanged -= value; }
}

private void OnValueChanged(EventArgs e)
{
    EventHandler handler = valueChanged;
    if (handler != null)
        handler(this, e);
}

并在事件add方法中添加断点。