Как обрабатывать дочернее событие в родительском контроле - PullRequest
4 голосов
/ 24 ноября 2011

В моем главном окне у меня есть дочерний элемент управления (пользовательский элемент управления), который содержит текстовое поле.Как я могу обработать событие textchange текстового поля дочернего элемента управления в главном (родительском) окне.

Пожалуйста, предоставьте мне пример кода, поскольку я новичок в маршрутизации событий.

Ответы [ 3 ]

10 голосов
/ 24 ноября 2011

Вы должны просто иметь возможность перехватить событие из родительского элемента управления. Но поскольку ваш родительский элемент управления не имеет собственного события TextChanged, вам необходимо использовать синтаксис присоединенного свойства:

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

и в вашем коде:

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

Вам не нужно специально указывать TextBox.TextChanged= на Window - просто любой элемент управления, который является родительским для TextBox, т. Е. Любой элемент управления, являющийся родительским для вашего UserControl. Событие будет всплывать до каждого родителя по очереди, вплоть до верхнего уровня Window, и может быть обработано в любом месте по пути.

(Обратите внимание, что если кто-то перехватит событие и установит e.Handled = true, событие не достигнет этой точки. Полезно знать, если у вас есть обработчики на нескольких уровнях.)

1 голос
/ 24 февраля 2012

это также помогло мне. У меня будет событие в контейнере дочернего элемента управления, и я определю это событие в коде файла. Событие будет обрабатывать все измененные текстовые события для всех дочерних элементов.

       <StackPanel TextBoxBase.TextChanged="test_TextChanged" Name="test">                                    
                <userControl/>
       </StackPanel>
0 голосов
/ 24 ноября 2011

Создать событие в вашем childcontrol -

public event TextChangedEventHandler TextChanged;

теперь добавим обработчик для события TextChanged TextBox в childcontrol -

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

также обновите XAML для этого обработчика -

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

Теперь вы создали событие в вашем дочернем элементе управления, которое срабатывает при срабатывании текстового поля.

Теперь вам нужно только добавить обработчик для этого события в mainwindow -

private void ChildControl_TextChanged(object sender, TextChangedEventArgs args)
{
   //TODO: Add your further code here.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...