{TemplateBinding X}只是编写{Binding X, RelativeSource={RelativeSource TemplatedParent}}的快捷方式。TemplateBinding等价于{Binding RelativeSource={RelativeSource TemplatedParent}}。

1.TemplateBinding是在编译时评估的,而RelativeSource TemplatedParent是在运行时评估的。所以模板Template中的触发器是在运行中进行判断的,属性绑定应该使用TemplatedParent的形式,使用TemplateBinding则会报错。

             <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type local:ButtonEx}">
                            <Border x:Name="border" Background="{TemplateBinding Background}" 
                                    CornerRadius="{TemplateBinding CornerRadius}" 
                                    BorderBrush="{TemplateBinding BorderBrush}" 
                                    BorderThickness="{TemplateBinding BorderThickness}" 
                                    Width="{TemplateBinding Width}" 
                                    Height="{TemplateBinding Height}" 
                                    SnapsToDevicePixels="True">
                                <TextBlock x:Name="txt" Text="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
                            </Border>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsMouseOver" Value="True">
                                    <Setter TargetName="border" Property="Background" Value="{Binding MouseOverBackground,RelativeSource= {RelativeSource Mode=TemplatedParent}}"/>
                                    <Setter TargetName="txt" Property="Foreground" Value="{Binding MouseOverForeground,RelativeSource= {RelativeSource Mode=TemplatedParent}}"/>
                                    <Setter TargetName="border" Property="BorderBrush" Value="{Binding MouseOverBorderbrush,RelativeSource= {RelativeSource Mode=TemplatedParent}}"/>
                                </Trigger>
                                <Trigger Property="IsPressed" Value="True">
                                    <Setter TargetName="border" Property="Background" Value="{Binding MousePressedBackground,RelativeSource={RelativeSource TemplatedParent}}"/>
                                    <Setter TargetName="txt" Property="Foreground" Value="{Binding MousePressedForeground,RelativeSource={RelativeSource TemplatedParent}}"/>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>

2、TemplateBinding的数据绑定是单向的,从数据源到目标(即从应用Template的控件到Template)。Binding的数据绑定方式是能够经过Mode设置的,可单向、双向等。

3、TemplateBinding不能对数据对象进行自动转换,数据源和目标的数据类型不同时候,需要自己写转换器。Binding会对数据源和目标的数据类型进行自动转换

使用总结:

因为TemplateBinding是在编译时求值的,所以TemplateBinding的求值速度要快一些,但是如果它认为不存在绑定属性,它将抛出错误。如果您知道该属性存在,但编译器不知道该属性,则可以使用RelativeSource TemplatedParent,因为它是在运行时而不是编译时求值的。例如模板中的触发器绑定时必须使用RelativeSource TemplatedParent。

总而言之,请使用TemplateBinding,除非它给您一个错误并且您知道该属性存在,然后使用RelativeSource TemplatedParent。