Привязка в шаблоне элемента управления
Когда вы создаете шаблон элемента управления и хотите привязать его к родительскому шаблону, вы можете использовать:
<TextBlock Name="tb" Text="{TemplateBinding Caption}"/> <!-- Which is the same as --> <TextBlock Name="tb" Text="{Binding Caption, RelativeSource={RelativeSource TemplatedParent}}"/>
Хотя два показанных здесь синтаксиса в большинстве случаев эквивалентны, между ними есть некоторые отличия:
1) TemplateBinding
принимает только одно свойство, а не путь к свойству, поэтому, если вы хотите выполнить привязку с использованием пути к свойству, вы должны использовать второй синтаксис:
<!-- 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}}"/>
2) TemplateBinding
поддерживает только режим OneWay из соображений производительности (это то же самое, что и WPF). Это означает, что TemplateBinding
фактически эквивалентен {Binding RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}
. Если в шаблоне элемента управления требуется двусторонняя привязка (TwoWay
), необходим полный синтаксис, как показано ниже. Обратите внимание, что Binding
также будет использовать режим привязки по умолчанию, в отличие от TemplateBinding
.
{Binding RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}
3) TemplateBinding
можно использовать только в IStyledElement
.
<!-- 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}}"/>