How to add a new property to a control template/style

controltemplate, styles, wpf

Solution

I created an Attached Property like this:

public sealed class AP : DependencyObject 
{
    public static bool GetIsChecked(DependencyObject obj)
    {
        return (bool)obj.GetValue(IsCheckedProperty);
    }

    public static void SetIsChecked(DependencyObject obj, bool value)
    {
        obj.SetValue(IsCheckedProperty, value);
    }

    // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty IsCheckedProperty =
        DependencyProperty.RegisterAttached("IsChecked", typeof(bool), typeof(AP), new UIPropertyMetadata(false));
}

Then all I had to do was:

<Expander my:AP.IsChecked="{Binding Path=TestBool}" />   

And on the template:

<CheckBox VerticalAlignment="Center" Margin="4,0,0,2" IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(my:AP.IsChecked)}" />

I wonder what to do if the style was defined in a different assembly tough...

Problem

I just created an Expander style with a checkbox in the header: ``` <Style TargetType="{x:Type Expander}" x:Key="MyCheckboxExpander"> <Setter Property="Background" Value="{StaticResource ExpanderBackgroundBrush}"/> <Setter Property="HeaderTemplate" Value="{StaticResource MyHeaderExpander}" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Expander}"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*" x:Name="ContentRow"/> </Grid.RowDefinitions> <Border Grid.Row="0" x:Name="Border" Background="{TemplateBinding Background}" BorderThickness="1" BorderBrush="{StaticResource ExpanderBorderBrush}" CornerRadius="2,2,0,0"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="18"/> <ColumnDefinition Width="*"/> <ColumnDefinition Width="20"/> </Grid.ColumnDefinitions> <CheckBox VerticalAlignment="Center" Margin="4,0,0,2"/> <ToggleButton Grid.Column="2" x:Name="ToggleBt" Template="{DynamicResource MyExpanderToggleButton}" Background="{StaticResource ExpanderBackgroundBrush}" IsChecked="{Binding Path=IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" OverridesDefaultStyle="True"/> <ContentPresenter Grid.Column="1" Margin="0,0,0,0" RecognizesAccessKey="True" ContentSource="Header"/> </Grid> </Border> <Border Visibility="Collapsed" Grid.Row="1" x:Name="ExpandSite" Background="{StaticResource ContentBackgroundBrush}" BorderBrush="{StaticResource ExpanderBorderBrush}" BorderThickness="1,0,1,1" CornerRadius="0,0,2,2"> <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Focusable="false"/> </Border> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsExpanded" Value="True"> <Setter Property="Visibility" Value="Visible" TargetName="ExpandSite"/> </Trigger> <Trigger Property="IsEnabled" Value="False"> <Setter Property="Background" Value="{StaticResource ExpanderBackgroundBrush}" TargetName="Border"/> <Setter Property="BorderBrush" Value="{StaticResource ExpanderBackgroundBrush}" TargetName="Border"/> <Setter Property="Visibility" Value="Hidden" TargetName="ToggleBt" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> ``` How can I create a new property (IsChecked) for this expander in order to bind to a boolean value? e. g: ``` <Expander IsChecked="{Binding MyBoolValue}" /> ``` Also on the template: ``` <CheckBox VerticalAlignment="Center" Margin="4,0,0,2" IsChecked="{TemplateBinding ????}" /> ``` EDIT: I found a similar question but I want to know if there's another way to do it without using control inheritance.

Original source

Related problems