In the following XAML I'm using a Rectangle with a Border as the Template for a ToggleButton. I want the BorderBrush to be a different colour to reflect the changing value of ToggleButton.IsChecked. Unfortunately my attempt here of using a TemplateBinding in the DataTrigger doesn't work. What do I need to do instead?
<StackPanel Orientation="Horizontal"> <StackPanel.Resources> <ControlTemplate x:Key="ButtonAsSwatchTemplate"> <Border BorderThickness="1"> <Border.Style> <Style> <Setter Property="BorderBrush" Value="Gainsboro" /> <Style.Triggers> <!-- TemplateBinding doesn't work.--> <DataTrigger Binding={TemplateBinding Property=IsChecked} Value="True"> <Setter Property="BorderBrush" Value="Black" /> </DataTrigger> </Style.Triggers> </Style> </Border.Style> <Rectangle Fill="{TemplateBinding Property=Background}" Width="15" Height="15" /> </Border> </ControlTemplate> </StackPanel.Resources> <ToggleButton Template="{StaticResource ButtonAsSwatchTemplate}" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="2" Background="Red" /> </StackPanel> EDIT
When I build and reload the designer I get the following error:
Error 1 Property 'Binding' does not support values of type 'TemplateBindingExpression'.
SOLUTION
<StackPanel Orientation="Horizontal"> <StackPanel.Resources> <ControlTemplate x:Key="ButtonAsSwatchTemplate"> <Border x:Name="SwatchBorder" BorderThickness="1"> <Rectangle Fill="{TemplateBinding Property=Background}" Width="15" Height="15" /> </Border> <ControlTemplate.Triggers> <Trigger Property="ToggleButton.IsChecked" Value="True"> <Setter TargetName="SwatchBorder" Property="BorderBrush" Value="Yellow" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </StackPanel.Resources> <RadioButton Template="{StaticResource ButtonAsSwatchTemplate}" GroupName="CropGuidesColourRadioButtonGroup" IsChecked="{Binding Checked}" Margin="2" Background="Red" /> <RadioButton Template="{StaticResource ButtonAsSwatchTemplate}" GroupName="CropGuidesColourRadioButtonGroup" IsChecked="{Binding Checked}" Margin="2" Background="Black" /> ... </StackPanel>