2011-04-20 84 views
0

我有一个复选框,其中缺陷属性被绑定到另一个复选框。在资源块中,我设置了一个设置复选框的事件触发器的样式。这里是代码:有界复选框没有触发事件

<Style x:Key="cbClickEvent" TargetType="{x:Type CheckBox}"> 
    <EventSetter Event="Click" Handler="CheckBox_Click"/> 
</Style> 

<StackPanel Grid.Column="0" Grid.Row="1"> 
    <CheckBox x:Name="cbAll" Content=" All" VerticalAlignment="Center"/> 
    <CheckBox Content=" MyCB" VerticalAlignment="Center" IsChecked="{Binding ElementName=cbAll, Path=IsChecked, Mode=OneWay}" Style="{StaticResource cbClickEvent}"/> 
</StackPanel> 

当我点击复选框MyCB事件被触发,但不是当我点击复选框全部。我错过了什么?

回答

1

这是因为当你点击“全部”复选框的值被通过结合转移到了“MyCB”复选框。但是在这种风格中,您订阅了Click事件,在这种情况下显然不会触发,因为您实际上未点击“MyCB”复选框(单击“全部”)。

你可以做的是,而不是订阅的Click事件,您可以订阅CheckedUnchecked事件:

<EventSetter Event="Checked" Handler="CheckBox_Checked"/> 
<EventSetter Event="Unchecked" Handler="CheckBox_Unchecked"/> 
+0

这不会使任何工作,问题是,他并没有设置Style到cbAll CheckBox,即使他向Checked和Unchecked事件添加了处理程序,如果他没有首先将Style设置为cbAll CheckBox,它们仍不会被解雇。 – Carlo 2011-04-20 20:12:10

+0

@Carlo - 当您点击“All”复选框时,值('IsChecked')将通过绑定转移到“MyCB”的“IsChecked”。并且因为'IsChecked'值被改变了,'Checked' /'Unchecked'事件将会在“MyCB”复选框(应用了样式的地方)上触发,所以处理程序将被执行。 – 2011-04-20 20:18:51

+0

是的,我听到你,但IsChecked与Click事件无关。您可以选中并取消选中,无论点击事件是否被点击,点击事件都会被解雇。你所说的是,如果他订阅了Checked和Unchecked事件,那么Checked和Unchecked处理程序将同时被触发在botch CheckBoxes上(因为IsChecked属性被绑定)。但是如果你仔细观察,如果风格设置不正确,那么cbAll没有订阅Click事件(也不会被Checked和Unchecked事件),在这种情况下,它不是。 – Carlo 2011-04-20 20:31:01

0

2个可能孤子:

1)添加

Style="{StaticResource cbClickEvent}" 

到cbAll复选框

2)从MyCB复选框该行并删除X:从风格Key属性。它看起来是这样的:

<Window.Resources> 
    <Style TargetType="{x:Type CheckBox}"> 
     <EventSetter Event="Click" Handler="CheckBox_Click"/> 
    </Style> 
</Window.Resources> 


<StackPanel Grid.Column="0" Grid.Row="1"> 
    <CheckBox x:Name="cbAll" 
       Content=" All" 
       VerticalAlignment="Center" /> 
    <CheckBox Content=" MyCB" 
       VerticalAlignment="Center" 
       IsChecked="{Binding ElementName=cbAll, Path=IsChecked, Mode=OneWay}" /> 
</StackPanel>