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
方法处设置断点。
我有一个自定义控件,它有一个支持双向绑定的 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
方法处设置断点。