TemplateBinding используется для привязки к свойствам элемента в определении шаблона. В вашем примере вы могли бы написать
<Border Padding="{Binding Padding}" ...>
означает привязать свойство padding границы к свойству padding ... что? Вы хотели бы сказать: «свойство padding элемента управления, для которого используется этот шаблон». Вы не можете дать ему имя, потому что в настоящее время вы не знаете x: Name элемента управления (даже если бы вы это сделали, это не сработало бы, потому что оно находится в другой области имен). Однако вы можете сделать это, указав относительный источник
<Border Padding="{Binding Padding, RelativeSource={RelativeSource TemplatedParent}" ...>
или используйте TemplateBinding, который является ярлыком (*) для вышеуказанного
<Border Padding="{TemplateBinding Padding}" ...>
(*) Помимо того, что TemplateBinding менее подробен в этих сценариях создания шаблонов, он имеет несколько отличий от обычного связывания:
- Он оценивается во время компиляции. (если, например, свойство Padding не существует, вы получите ошибку компиляции. Но если бы вы использовали привязку с TemplatedParent, вы бы увидели ошибку только во время выполнения.)
- Это всегда односторонняя привязка.
- Это требует, чтобы и исходные, и целевые свойства были свойствами зависимостей .
- У него гораздо меньше функциональных возможностей (без StringFormat, Delay, IsAsync и т. Д. См. Свойства Binding vs TemplateBindingExtention ).