在父表单中修改属性是不合适的。相反,子表单应该触发一个事件,由父表单监听并相应地更改自己的值。
从子表单操作父表单会创建双向耦合 - 父表单拥有子表单,但子表单也对父表单具有亲密的了解和依赖关系。冒泡是此问题的解决方案,因为它允许信息向上(“冒泡”)流动,同时避免任何严格的耦合。
以下是事件的最基本示例。 它不包括传递事件中的特定信息(这可能是您需要的),但涵盖了概念。
在您的子表单中:
public event EventHandler SomethingHappened;
protected virtual void OnSomethingHappened(EventArgs e)
{
if(this.SomethingHappened != null)
{
this.SomethingHappened(this, e);
}
}
private void SomeMethod()
{
OnSomethingHappened(EventArgs.Empty);
}
在您的父表单中:
void OnInit(EventArgs e)
{
myChildControl.SomethingHappened += new EventHandler(HandleSomethingHappened);
}
private void HandleSomethingHappened(object sender, EventArgs e)
{
}
如我上面所说,你可能需要在事件中传递一些特定的信息。我们可以用几种方法来实现这个目标,但最简单的方法是创建自己的EventArgs类和委托。看起来你需要指定某个值是true还是false,那么让我们使用它:
public class BooleanValueChangedEventArgs : EventArgs
{
public bool NewValue;
public BooleanValueChangedEventArgs(bool value)
: base()
{
this.NewValue = value;
}
}
public delegate void HandleBooleanValueChange(object sender, BooleanValueChangedEventArgs e);
我们可以更改事件以使用这些新签名:
public event HandleBooleanValueChange SomethingHappened;
然后我们传递我们的自定义 EventArgs 对象:
bool checked = //get value
OnSomethingHappened(new BooleanValueChangedEventArgs(checked))
然后我们相应地更改父级中的事件处理方式:
void OnInit(EventArgs e)
{
myChildControl.SomethingHappened += new HandleBooleanValueChange(HandleSomethingHappened);
}
private void HandleSomethingHappened(object sender, BooleanValueChangedEventArgs e)
{
bool value = e.NewValue;
}
EventHandler<BooleanValueChangedEventArgs>
,而无需创建自己的委托类型。这还将逻辑上标记为事件处理程序委托。 - Matthew Scharley