chick3n0x07CC
chick3n0x07CC

Reputation: 798

Checkbox check event doesn't get fired

I'm stuck with this. I have a button with a checkbox inside in WPF.

The button in the template:

<Button Name="deleteButton" Style="{StaticResource RoundCornerButtonWithCheck}" Content="{Binding Source={x:Static localization:Resources.Delete}, Converter={StaticResource CharacterCasingConverter}}" VerticalAlignment="Center" HorizontalAlignment="Left" Background="Red" Foreground="White" Margin="80,0,80,30" Click="DeleteClick"></Button>

As the checkbox is declared inside a style, in order to get a reference to that checkbox, I do from code-behind:

FrameworkElement templatedControl = this.deleteButton.Template.LoadContent() as FrameworkElement;
CheckBox templatedCheck = templatedControl.FindName("checkbox") as CheckBox;

And then, I implement the method for the click event, in code-behind:

public void DeleteClick(object sender, RoutedEventArgs e)
    {
        if (!(e.OriginalSource is CheckBox))
        {
                bool isChecked = templatedCheck.IsChecked.HasValue && templatedCheck.IsChecked.Value == true;
                Debug.Print(isChecked);    // This always returns false
        }
    }

But I always get false value.

I also tried adding a RoutedEventHandler in the constructor:

templatedCheck.Checked += new RoutedEventHandler(this.OnCheckChanged);
templatedCheck.Unchecked += new RoutedEventHandler(this.OnCheckChanged);

And then defined the handlers. But no effect, the methods aren't called when I check the checkbox.

My thoughts are that it has something to do with the fact that the checkbox is inside the button and it's like when the checked event gets fired from the checkbox, it is catched by the button and doesn't arrive to my code. Anyway, is my hypothesis, but can't wonder the solution.

Style for the checkbox:

<Style x:Key="FilledCheckBox" TargetType="{x:Type CheckBox}">
<Setter Property="Foreground" Value="Gray"/>
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="{x:Type CheckBox}"> 
            <BulletDecorator Background="Transparent">
                <BulletDecorator.Bullet>
                    <Border x:Name="Border"
                            Width="15"
                            Height="15"
                            CornerRadius="1"
                            BorderThickness="1">
                        <Border.BorderBrush>
                            <SolidColorBrush Color="Gray"/>
                        </Border.BorderBrush>
                        <Border.Background>
                            <SolidColorBrush Color="White"/>
                        </Border.Background>
                    </Border>
                </BulletDecorator.Bullet>
                <ContentPresenter Margin="5,0,0,0"
                                  VerticalAlignment="Top"
                                  HorizontalAlignment="Left"
                                  RecognizesAccessKey="True" />
            </BulletDecorator>
            <ControlTemplate.Triggers>
                <Trigger Property="IsChecked" Value="True">
                    <Setter Property="Background" TargetName="Border" Value="Green"/>
                    <Setter Property="BorderBrush" TargetName="Border" Value="Green"/>
                    <Setter Property="Foreground" Value="Green"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Setter.Value>
</Setter>

Style for the button (with the checkbox inside):

<Style x:Key="RoundCornerButtonWithCheck" TargetType="{x:Type Button}">
        <Setter Property="HorizontalContentAlignment" Value="Center"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Setter Property="Width" Value="120"/>
        <Setter Property="Height" Value="30"/>
        <Setter Property="Padding" Value="1"/>
        <Setter Property="Button.Effect">
            <Setter.Value>
                <DropShadowEffect Color="Black" Direction="280" ShadowDepth="2" BlurRadius="5" Opacity="0.2" />
            </Setter.Value>
        </Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Grid x:Name="grid">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="120"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <Border x:Name="border" CornerRadius="15" BorderBrush="Black" BorderThickness="0"  Background="{TemplateBinding Background}">
                            <ContentPresenter HorizontalAlignment="Center"
                                              VerticalAlignment="Center"
                                              TextElement.FontWeight="SemiBold">
                            </ContentPresenter>
                        </Border>

                        <CheckBox x:Name="checkbox" Grid.Column="0" VerticalAlignment="Center" Margin="20,0,0,0" Style="{StaticResource FilledCheckBox}"></CheckBox>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsPressed" Value="True">
                            <Setter Property="Background" TargetName="border">
                                <Setter.Value>
                                    <SolidColorBrush Color="Gold" />
                                </Setter.Value>
                            </Setter>
                        </Trigger>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="BorderBrush" TargetName="border" Value="#FF33962B"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="False">
                            <Setter Property="Opacity" TargetName="grid" Value="0.25"/>
                        </Trigger>

                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Upvotes: 0

Views: 80

Answers (1)

mm8
mm8

Reputation: 169150

This should work:

private void SaveClick(object sender, RoutedEventArgs e)
{
    if (!(e.OriginalSource is CheckBox))
    {
        Button button = (Button)sender;
        CheckBox templatedCheck = button.Template.FindName("checkbox", button) as CheckBox;
        if (templatedCheck != null)
            Debug.Print(templatedCheck.IsChecked.ToString());
    }
}

It gets a reference to the CheckBox in the template of the Button that is actually clicked, and this one is either checked or not checked.

DataTemplate.LoadContent() creates another Button element based on the template which is not what you want.

Upvotes: 2

Related Questions