TemplateBinding використовується для прив’язки до властивостей елемента в рамках визначення шаблону. У вашому прикладі ви могли написати
<Border Padding="{Binding Padding}" ...>
означає прив’язувати властивість прокладки кордону до властивості набивання ... що? Ви б хотіли сказати, "властивість блокування елемента управління, для якого використовується цей шаблон". Ви не можете дати йому ім'я, оскільки на даний момент ви не знаєте x: Ім'я елемента керування (навіть якби ви це зробили, воно не працюватиме, оскільки його в іншому діапазоні імен). Однак це можна зробити, визначивши відносне джерело
<Border Padding="{Binding Padding, RelativeSource={RelativeSource TemplatedParent}" ...>
або використовувати TemplateBinding, який є ярликом (*) для вище
<Border Padding="{TemplateBinding Padding}" ...>
(*) Окрім того, що в цих сценаріях шаблонування є менш докладною, TemplateBinding має ще кілька відмінностей порівняно з звичайними палітурками:
- Він оцінюється під час компіляції. (якщо, наприклад, властивості Padding не існувало, ви отримаєте помилку компіляції. Але якщо ви використовуєте прив'язку з TemplatedParent, ви побачите помилку лише під час виконання.)
- Це завжди одностороння обов'язковість.
- Це вимагає, щоб і вихідні, і цільові властивості були властивостями залежності .
- Він має набагато меншу функціональність (відсутність StringFormat, Delay, IsAsync тощо. Див. Властивості Binding vs TemplateBindingExtention ).