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:
-
TemplateBinding
accepts 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
TemplateBinding
only supportsOneWay
mode for performance reasons (this is the same as WPF). This means aTemplateBinding
is actually equivalent to{Binding RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}
. IfTwoWay
binding is required in a control template, the full syntax is needed as shown below. Note thatBinding
will also use the default binding mode unlikeTemplateBinding
.{Binding RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}
-
TemplateBinding
can 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}}"/>