2011-04-20 81 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>