如何在父控件中处理子事件

时间:2011-11-24 14:44:48

标签: wpf events event-handling routing event-bubbling

在我的主窗口中,我有一个包含文本框的子控件(用户控件)。如何在main(父)窗口中处理子控件文本框的textchange事件。

请提供一些代码示例,因为我不熟悉事件路由。

3 个答案:

答案 0 :(得分:10)

您应该能够从父控件挂钩事件。但由于您的父控件没有自己的TextChanged事件,因此您需要使用附加属性语法:

<Window ...
        TextBox.TextChanged="ChildTextBoxChanged">

并在你的代码隐藏中:

private void ChildTextBoxChanged(object sender, TextChangedEventArgs args)
{
    ...
}

您不必专门将TextBox.TextChanged=放在Window上 - 只是TextBox的父级控件,即任何属于您{的父级的控件{1}}。该事件将依次向每个父级冒泡,一直到顶级UserControl,并且可以在整个过程中随处理。

(请注意,如果有人挂钩事件并设置Window,则事件不会超过该点。有用的是知道您是否有多个级别的处理程序。)

答案 1 :(得分:1)

这对我也很有帮助。我将在子控件的容器中有一个事件,并在代码隐藏文件中定义事件。该事件将处理所有孩子的所有文本更改事件。

       <StackPanel TextBoxBase.TextChanged="test_TextChanged" Name="test">                                    
                <userControl/>
       </StackPanel>

答案 2 :(得分:0)

在您的childcontrol中创建一个事件 -

public event TextChangedEventHandler TextChanged;

现在为childcontrol中的TextBox的TextChanged事件添加一个处理程序 -

private void TextBox_TextChanged(object sender, TextChangedEventArgs args)
{
    if (TextChanged != null)
    {
        TextChanged.Invoke(this, args);
    }
}

还为此处理程序更新XAML -

<TextBox ... TextChanged="TextBox_TextChanged" ... />

现在,您已在childcontrol中创建了一个事件,该事件在Textbox的textchanged触发时触发。

现在您只需在mainwindow中为此事件添加处理程序 -

private void ChildControl_TextChanged(object sender, TextChangedEventArgs args)
{
   //TODO: Add your further code here.
}