TemplateBinding é usado para vincular as propriedades do elemento na definição do modelo. Em seu exemplo, você poderia ter escrito
<Border Padding="{Binding Padding}" ...>
que significa vincular a propriedade de preenchimento da fronteira à propriedade de preenchimento de ... o quê? Você gostaria de dizer, "propriedade de preenchimento do controle para o qual este modelo está sendo usado." Você não pode dar um nome a ele porque você não sabe o x: Nome do controle neste momento (mesmo se soubesse, não funcionaria porque está em um namescope diferente). No entanto, você pode fazer isso definindo uma fonte relativa
<Border Padding="{Binding Padding, RelativeSource={RelativeSource TemplatedParent}" ...>
ou use TemplateBinding que é um atalho (*) para o acima
<Border Padding="{TemplateBinding Padding}" ...>
(*) Além de ser menos prolixo nesses cenários de modelagem, TemplateBinding tem algumas diferenças em comparação com uma vinculação regular:
- Ele é avaliado em tempo de compilação. (se, por exemplo, a propriedade Padding não existisse, você obteria um erro de compilação. Mas se você fosse usar uma vinculação com TemplatedParent, só veria o erro em tempo de execução).
- É sempre uma ligação unilateral.
- Requer que as propriedades de origem e destino sejam propriedades de dependência .
- Tem muito menos funcionalidade (sem StringFormat, Delay, IsAsync, etc. veja as propriedades de Binding vs TemplateBindingExtention ).