What is the difference between these 2 bindings:
<ControlTemplate TargetType="{x:Type Button}">
<Border BorderBrush="{TemplateBinding Property=Background}">
<ContentPresenter />
</Border>
</ControlTemplate>
and
<ControlTemplate TargetType="{x:Type Button}">
<Border BorderBrush="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background}">
<ContentPresenter />
</Border>
</ControlTemplate>
TemplateBinding - More limiting than using regular Binding
- More efficient than a Binding but it has less functionality
- Only works inside a ControlTemplate\'s visual tree
- Doesn\'t work with properties on Freezables
- Doesn\'t work within a ControlTemplate\'s Trigger
- Provides a shortcut in setting properties(not as verbose),e.g. {TemplateBinding targetProperty}
Regular Binding - Does not have above limitations of TemplateBinding
- Respects Parent Properties
- Resets Target Values to clear out any explicitly set values
- Example: <Ellipse Fill="{Binding RelativeSource={RelativeSource TemplatedParent},Path=Background}"/>
One more thing - TemplateBindings don\'t allow value converting. They don\'t allow you to pass a Converter and don\'t automatically convert int to string for example (which is normal for a Binding).
TempleteBinding is a shorthand for Binding with TemplatedParent but it does not expose all the capabilities of the Binding class, for example you can\'t control Binding.Mode from TempleteBinding.