【问题标题】:Bindingsource not subscribed to ValueChanged eventBindingsource 未订阅 ValueChanged 事件
【发布时间】:2016-05-02 18:37:53
【问题描述】:

我有一个自定义控件,它有一个支持双向绑定的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 事件。我检查了设计器生成的代码,并没有使 bindingsource 注册到事件。我认为将绑定添加到数据绑定应该这样做,但事实并非如此。

这里可能缺少什么?

【问题讨论】:

    标签: c# winforms data-binding bindingsource


    【解决方案1】:

    一切都很好。

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

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

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

    【讨论】:

    • 谢谢你的这个sn-p。现在我可以跟踪是否正在发生绑定,并了解为什么未在数据源中设置该值。
    猜你喜欢
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 2011-02-05
    相关资源
    最近更新 更多