Ответ 1
Это должно работать для случая, когда вы создаете шаблон для элемента управления, и хотите привязать значение свойства этого элемента управления к свойству другого элемента управления внутри шаблона. В вашем случае вы что-то замаскируете (назовите его MyControl), и этот шаблон будет содержать границу, чье заполнение должно быть привязано к дополнению MyControl.
A TemplateBinding - это оптимизированная форма сценария Binding для шаблонов, аналогичная привязке, построенной с помощью {Binding RelativeSource = {RelativeSource TemplatedParent}}.
По какой-либо причине указание TemplatedParent как источника привязки не работает в настройках стиля. Чтобы обойти это, вы можете указать относительный родитель как AncestorType элемента управления, который вы используете templating (который эффективно находит TemplatedParent, если вы не ввели другие MyControls в шаблон MyControl).
Я использовал это решение, когда пытался создать настраиваемый шаблон элемента управления Button, в котором (String) Содержимое кнопки необходимо привязать к свойству Text объекта TextBlock в ControlTemplate для кнопки. Вот как выглядел этот код:
<StackPanel>
<StackPanel.Resources>
<ControlTemplate x:Key="BarButton" TargetType="{x:Type Button}">
<ControlTemplate.Resources>
<Style TargetType="TextBlock" x:Key="ButtonLabel">
<Setter Property="Text" Value="{Binding Path=Content, RelativeSource={RelativeSource AncestorType={x:Type Button}} }" />
</Style>
</ControlTemplate.Resources>
<Grid>
<!-- Other controls here -->
<TextBlock Name="LabelText" Style="{StaticResource ButtonLabel}" />
</Grid>
</ControlTemplate>
</StackPanel.Resources>
<Button Width="100" Content="Label Text Here" Template="{StaticResource BarButton}" />
</StackPanel>