WPF - 家长如何知道关于子控件的“已检查”事件复选框?

时间:2011-04-27 21:14:36

标签: c# wpf checkbox user-controls wpf-controls

我有一个带有复选框和webbrowser的子控件:

<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公开“Checked”事件?或者有更好的方法吗?

我在网上搜索过,但似乎无法绕过我所看到的内容。

提前谢谢你,

-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);
}

现在我能够看到“Checked”事件“冒泡”了:

<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:

Matt的第一个答案是最好的方法,我有“Checkbox”vs“CheckBox”...将CheckBox.Checked添加到网格捕获事件:     

2 个答案:

答案 0 :(得分:3)

Checked事件冒泡到父母并抓住它。这是路线事件的美丽!

<Grid CheckBox.Checked="CheckBox_Checked">
    <local:MyUserControl x:Name="MyUserControl_Main" />
</Grid>

答案 1 :(得分:0)

你走在正确的轨道上,但是你应该在MyUserControl中声明路由事件,而不是MainWindow ...这是提升事件的用户控件,而不是窗口。你这样做的方式,你的控制权明确取决于MainWindow,这是不好的做法而且没有必要。