How to use a trigger on ToggleButton.IsChecked or IsPressed correctly?

13,012

Solution 1

If you give your ToggleButton a name and then reference that in the trigger setters then it should work. So, your ControlTemplate would look something like...

<ControlTemplate TargetType="RadioButton">
    <ToggleButton Name="toggleButton" IsChecked="{Binding IsChecked, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"
                  Content="{Binding Content, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"
                              BorderThickness="2" BorderBrush="Yellow" Background="White"/>
    <ControlTemplate.Triggers>
        <Trigger Property="ToggleButton.IsChecked" Value="True">
            <Setter TargetName="toggleButton" Property="Content" Value="different txt" />
        </Trigger>
        <Trigger Property="ToggleButton.IsPressed" Value="True">
            <Setter TargetName="toggleButton" Property="Content" Value="different text" />
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

Solution 2

The prefixed types in the triggers are not needed, also change the bindings on the togglebutton to TemplateBindings.

Share:
13,012
Greg
Author by

Greg

Programming, cursing, riding my bikes and learning foreign languages.

Updated on June 04, 2022

Comments

  • Greg
    Greg almost 2 years

    That's my code:

    <Window x:Class="WpfTests.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Thickness x:Key="tasksMargin">0,10,0,0</Thickness>
    
    </Window.Resources>
    <Grid>
        <DockPanel HorizontalAlignment="Left">
            <!--<Border Padding="15">-->
            <GroupBox>
                <GroupBox.Header>
                    Database Tasks
                </GroupBox.Header>
                <StackPanel Width="Auto" >
                    <StackPanel.Resources>
                        <Style  TargetType="RadioButton">
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="RadioButton">
                                        <ToggleButton IsChecked="{Binding IsChecked, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"
                          Content="{Binding Content, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"
                                      BorderThickness="2" BorderBrush="Yellow" Background="White"/>
                                        <ControlTemplate.Triggers>
                                            <Trigger Property="ToggleButton.IsChecked" Value="True">
                                                    <Setter Property="Content" Value="different txt" />
                                                </Trigger>
                                            <Trigger Property="ToggleButton.IsPressed" Value="True">
                                                    <Setter Property="Content" Value="different text" />
                                                </Trigger>
                                        </ControlTemplate.Triggers>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                            <Setter Property="Margin" Value="5">
                            </Setter>
                        </Style>
                    </StackPanel.Resources>
    
                    <RadioButton  GroupName="Group1"  x:Name="button1">Option1</RadioButton>
                    <RadioButton  GroupName="Group1" x:Uid="button2" x:Name="button2">button2</RadioButton>
                    <RadioButton  GroupName="Group1" x:Uid="button3" x:Name="button3">button3</RadioButton>
                </StackPanel>
            </GroupBox>
        </DockPanel>
    </Grid>
    

    However, the IsChecked and IsPressed triggers do not get triggered. how to I declare them properly?