TemplateBinding digunakan untuk mengikat properti elemen dalam definisi template. Dalam contoh Anda, Anda bisa menulis
<Border Padding="{Binding Padding}" ...>
artinya mengikat properti padding perbatasan ke properti padding dari ... apa? Anda ingin mengatakan, "properti padding dari kontrol tempat template ini digunakan." Anda tidak dapat memberinya nama karena Anda tidak mengetahui x: Nama kontrol saat ini (meskipun Anda melakukannya, kontrol tidak akan berfungsi karena berada dalam namescope yang berbeda). Namun, Anda dapat melakukan ini dengan menentukan sumber relatif
<Border Padding="{Binding Padding, RelativeSource={RelativeSource TemplatedParent}" ...>
atau gunakan TemplateBinding yang merupakan jalan pintas (*) untuk di atas
<Border Padding="{TemplateBinding Padding}" ...>
(*) Selain tidak terlalu bertele-tele dalam skenario pembuatan template ini, TemplateBinding memiliki beberapa perbedaan dibandingkan dengan binding biasa:
- Itu dievaluasi pada waktu kompilasi. (jika, misalnya, properti Padding tidak ada, Anda akan mendapatkan error kompilasi. Tetapi jika Anda menggunakan binding dengan TemplatedParent, Anda hanya akan melihat error tersebut saat runtime.)
- Itu selalu mengikat satu arah.
- Ini mensyaratkan bahwa properti sumber dan target adalah properti ketergantungan .
- Ini memiliki fungsionalitas yang jauh lebih sedikit (tidak ada StringFormat, Delay, IsAsync, dll. Lihat properti Binding vs TemplateBindingExtention ).