如何在用户控件中引发事件并在主页面中捕获?

51

我有一个 UserControl,需要通知父页面 UserControl 中的按钮已被点击。如何在 UserControl 中引发事件并在主页上捕获它?我尝试使用 static,但许多人建议我使用事件。

3个回答

91

查看事件冒泡--http://msdn.microsoft.com/en-us/library/aa719644%28vs.71%29.aspx

示例:

用户控件

public event EventHandler StatusUpdated;

private void FunctionThatRaisesEvent()
{
    //Null check makes sure the main page is attached to the event
    if (this.StatusUpdated != null)
       this.StatusUpdated(this, new EventArgs());
}

主页/表格

public void MyApp()
{
     //USERCONTROL = your control with the StatusUpdated event
     this.USERCONTROL.StatusUpdated += new EventHandler(MyEventHandlerFunction_StatusUpdated);
}

public void MyEventHandlerFunction_StatusUpdated(object sender, EventArgs e)
{
         //your code here
}

7
你可以使用USERCONTROL.StatusUpdated += MyEventHandlerFunction_StatusUpdated代替this.USERCONTROL.StatusUpdated += new EventHandler(MyEventHandlerFunction_StatusUpdated);。这样可以省去键入的时间和屏幕空间,特别是当处理泛型事件参数类型时。请注意,翻译保持了原意,但可能不完全符合中文表达习惯。 - Zebi
很酷,我不知道这个。Visual的“TAB”自动完成默认添加整行。 - Jemes
4
你可以将FunctionThatRaisesEvent()方法的主体简化为以下内容:StatusUpdated?.Invoke(new object(), new EventArgs());注意不要改变原本的意思,并使其更加通俗易懂。 - NickG
我可以像这样发送自己的参数吗? - Somachr
这个 MyApp() 方法在哪里?它是在 page_load 中调用的吗? - Dhananjay
显示剩余2条评论

7

只需在您的控件中添加一个事件:

public event EventHandler SomethingHappened;

当您想通知父组件时,请将其提高:

if(SomethingHappened != null) SomethingHappened(this, new EventArgs);

如果您需要自定义的EventArgs,请尝试使用EventHandler<T>,其中T是从EventArgs派生的类型。

1

如果您正在寻找更加解耦合的解决方案,您可以使用诸如MVVM Light Messenger之类的消息发布/订阅模型在这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接