Bindingsource 未订阅 ValueChanged 事件

Bindingsource not subscribed to ValueChanged event

我有一个自定义控件,它有一个支持双向绑定的 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);
}

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

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

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

但是,通过这样做,绑定源不会订阅 ValueChanged 事件。我检查了设计器生成的代码,并没有使绑定源注册到事件。我认为将绑定添加到数据绑定应该可以做到这一点,但事实并非如此。

这里可能遗漏了什么?

一切都很好。

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

请注意,如果您的控件从未真正可见 - 例如驻留在非活动标签页中,则数据绑定将不会被初始化,也不会起作用。我想这应该是某种优化,如果您不知道(甚至知道)可能会导致问题。

无论如何,如果您想确保您的 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 方法处设置断点。