如何将新的属性添加到控件模板/风格
问题描述:
我刚刚创建的扩展风格,在头一个复选框:如何将新的属性添加到控件模板/风格
<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>
我怎样才能为这个扩展,以创建一个新的属性(器isChecked)绑定到一个布尔值?即G:
<Expander IsChecked="{Binding MyBoolValue}" />
而且在模板:
<CheckBox VerticalAlignment="Center" Margin="4,0,0,2" IsChecked="{TemplateBinding ????}" />
编辑:
我发现了一个similar question但我想知道是否有另一种方式来做到这一点,而无需使用控制继承。
答
我创建了一个附加属性是这样的:
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));
}
然后,所有我需要做的就是:
<Expander my:AP.IsChecked="{Binding Path=TestBool}" />
,并且模板:
<CheckBox VerticalAlignment="Center" Margin="4,0,0,2" IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(my:AP.IsChecked)}" />
我不知道该怎么如果样式是在不同的装配难度中定义的,请执行...
想知道如果一个静态附加属性可能工作 - 不知道虽然...试一试可能吗? – Charleh 2012-07-09 16:36:29
是的,我刚刚读到它... – 2012-07-09 16:40:02