How To Create Templated Controls
Data Binding
When you're creating a control template and you want to bind to the templated parent you can use:
<TextBlock Name="tb" Text="{TemplateBinding Caption}"/>
<!-- Which is the same as -->
<TextBlock Name="tb" Text="{Binding Caption, RelativeSource={RelativeSource TemplatedParent}}"/>
Although the two syntaxes shown here are equivalent in most cases, there are some differences:
-
TemplateBindingaccepts only a single property rather than a property path, so if you want to bind using a property path you must use the second syntax:<!-- This WON'T work as TemplateBinding only accepts single properties -->
<TextBlock Name="tb" Text="{TemplateBinding Caption.Length}"/>
<!-- Instead this syntax must be used in this case -->
<TextBlock Name="tb" Text="{Binding Caption.Length, RelativeSource={RelativeSource TemplatedParent}}"/> -
A
TemplateBindingonly supportsOneWaymode for performance reasons (this is the same as WPF). This means aTemplateBindingis actually equivalent to{Binding RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}. IfTwoWaybinding is required in a control template, the full syntax is needed as shown below. Note thatBindingwill also use the default binding mode unlikeTemplateBinding.{Binding RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay} -
TemplateBindingcan only be used onIStyledElement.
<!-- This WON'T work as GeometryDrawing is not a IStyledElement. -->
<GeometryDrawing Brush="{TemplateBinding Foreground}"/>
<!-- Instead this syntax must be used in this case. -->
<GeometryDrawing Brush="{Binding Foreground, RelativeSource={RelativeSource TemplatedParent}}"/>