TemplateBinding与Binding区别在于
1:TemplateBinding只是单方向的数据绑定
2:TemplateBinding不会自动转换数据类型
这里用一个自定义ImageButton验证下第2条:
public class ImageButton : Button
{
public BitmapSource NormalImage
{
get { return (BitmapSource)GetValue(NormalImageProperty); }
set { SetValue(NormalImageProperty, value); }
}
public static readonly DependencyProperty NormalImageProperty =
DependencyProperty.Register("NormalImage", typeof(BitmapSource), typeof(ImageButton), new PropertyMetadata(null));
public BitmapSource HoverImage
{
get { return (BitmapSource)GetValue(HoverImageProperty); }
set { SetValue(HoverImageProperty, value); }
}
public static readonly DependencyProperty HoverImageProperty =
DependencyProperty.Register("HoverImage", typeof(BitmapSource), typeof(ImageButton), new PropertyMetadata(null));
public double ImageWidth
{
get { return (double)GetValue(ImageWidthProperty); }
set { SetValue(ImageWidthProperty, value); }
}
public static readonly DependencyProperty ImageWidthProperty =
DependencyProperty.Register("ImageWidth", typeof(double), typeof(ImageButton), new PropertyMetadata(20d));
public double ImageHeight
{
get { return (double)GetValue(ImageHeightProperty); }
set { SetValue(ImageHeightProperty, value); }
}
public static readonly DependencyProperty ImageHeightProperty =
DependencyProperty.Register("ImageHeight", typeof(double), typeof(ImageButton), new PropertyMetadata(20d));
public Thickness ImageMargin
{
get { return (Thickness)GetValue(ImageMarginProperty); }
set { SetValue(ImageMarginProperty, value); }
}
public static readonly DependencyProperty ImageMarginProperty =
DependencyProperty.Register("ImageMargin", typeof(Thickness), typeof(ImageButton), new PropertyMetadata(new Thickness()));
public ImageButton()
: base()
{
}
<Style x:Key="ImageButtonStyle" TargetType="ctrl:ImageButton" BasedOn="{StaticResource NoFocusableStyle}">
<Setter Property="FontFamily" Value="Microsoft YaHei"/>
<Setter Property="FontSize" Value="10"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ctrl:ImageButton">
<Grid Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" VerticalAlignment="{TemplateBinding VerticalAlignment}" >
<Image x:Name="img" Stretch="Fill" Source="{TemplateBinding NormalImage}" Width="{TemplateBinding ImageWidth}" Height="{TemplateBinding ImageHeight}" Margin="{TemplateBinding ImageMargin}">
</Image>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="img" Property="Source" Value="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=HoverImage}"/>
</Trigger>
<!--<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="content" Property="Foreground" Value="LightGray"/>
</Trigger>-->
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
如果上面的Triggers中
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="img" Property="Source" Value="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=HoverImage}"/>
</Trigger>
写成如下模式:
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="img" Property="Source" Value="{TemplateBinding HoverImage}"/>
</Trigger>
则会报错:表达式类型不是有效的 Style 值!