WPF - Как родитель узнает о событии «Проверено» для дочернего элемента управления? - PullRequest
1 голос
/ 28 апреля 2011

У меня есть дочерний элемент управления с флажком и веб-браузером:

<UserControl x:Class="Some.MyUserControl" etc.>
  <Grid>
    <CheckBox x:Name="chkA" Content="Analysis" Checked="chkA_Checked"></CheckBox>
    <WebBrowser Margin="0,30,0,0" Name="wbA"></WebBrowser>
  </Grid>
</UserControl>

Я помещаю этот элемент управления в свой файл MainWindow.xaml / .cs:

<Window x:Class Some.MainWindow xmlns:local="clr-namespace:Some" etc.>
  <Grid>
    <local:MyUserControl x:Name="MyUserControl_Main"></local:MyUserControl>
  </Grid>
</Window>

Мой вопросКак мое MainWindow может узнать, что CheckBox (chkA) был проверен?Пока только фактический пользовательский элемент управления знает, что на него нажали?Как я могу выставить событие «Проверено» для моего MainWindow, чтобы увидеть?Или есть лучший способ?

Я искал в Интернете, но, похоже, не могу обернуть голову вокруг того, что вижу.

Заранее спасибо,

-newb

РЕДАКТИРОВАТЬ 1:

Я пытаюсь выполнить следующее без удачи, но, возможно, на правильном пути.

В пределахмой MainWindow.xaml.cs Я добавил:

public static readonly RoutedEvent CheckedEvent = EventManager.RegisterRoutedEvent("Checked", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyUserControl));

public event RoutedEventHandler Checked
{
    add { AddHandler(CheckedEvent, value); }
    remove { RemoveHandler(CheckedEvent, value); }
}

И в MyUserControl.xaml.cs я добавил:

private void chkA_Checked(object sender, RoutedEventArgs e)
{
    RoutedEventArgs args = new RoutedEventArgs(MainWindow.CheckedEvent);
    RaiseEvent(args);
}

РЕДАКТИРОВАТЬ 2:

Переместил ранее упомянутый код в MyUserControl.xaml.cs:

public static readonly RoutedEvent CheckedEvent = EventManager.RegisterRoutedEvent("Checked", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyUserControl));

public event RoutedEventHandler Checked
{
    add { AddHandler(CheckedEvent, value); }
    remove { RemoveHandler(CheckedEvent, value); }
}

private void chkA_Checked(object sender, RoutedEventArgs e)
{
    RoutedEventArgs args = new RoutedEventArgs(MainWindow.CheckedEvent);
    RaiseEvent(args);
}

И теперь я могу видеть «Проверенное» событие «Пузырь» вверх так:

<Window x:Class Some.MainWindow xmlns:local="clr-namespace:Some" etc.>   
  <Grid>     
    <local:MyUserControl x:Name="MyUserControl_Main" **Checked="MyUserControl_Main_Checked"**></local:MyUserControl>   
  </Grid>
</Window>

Спасибо @Matt за подсказку!

РЕДАКТИРОВАТЬ 3:

Первый ответ Мэтта - лучший способ, у меня было "Checkbox" против "CheckBox"... Добавление CheckBox.Checked в сетку ловит событие:

Ответы [ 2 ]

3 голосов
/ 28 апреля 2011

Пусть событие Checked всплывет к родителю и поймает его там. Это красота разгромленных событий!

<Grid CheckBox.Checked="CheckBox_Checked">
    <local:MyUserControl x:Name="MyUserControl_Main" />
</Grid>
0 голосов
/ 28 апреля 2011

Вы на правильном пути, но вы должны объявить перенаправленное событие в MyUserControl, а не в MainWindow ... это событие вызывает пользовательский элемент управления, а не окно. То, как вы это делаете, ваш контроль явно зависит от MainWindow, что является плохой практикой и не нужно.

...