我有一个自定义控件,其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注册到事件。我假设将绑定添加到数据绑定应该这样做,但它没有。
这里可能缺少什么?
答案 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
方法中添加断点。