TemplateBinding được sử dụng để liên kết với các thuộc tính phần tử trong định nghĩa mẫu. Trong ví dụ của bạn, bạn có thể đã viết
<Border Padding="{Binding Padding}" ...>
nghĩa là ràng buộc thuộc tính padding của đường viền với thuộc tính padding của ... cái gì? Bạn muốn nói, "thuộc tính đệm của điều khiển mà mẫu này đang được sử dụng." Bạn không thể đặt tên cho nó vì bạn không biết x: Tên của điều khiển tại thời điểm này (ngay cả khi bạn đã làm vậy, nó sẽ không hoạt động vì nó nằm trong một kính tên khác). Tuy nhiên, bạn có thể làm điều này bằng cách xác định một nguồn tương đối
<Border Padding="{Binding Padding, RelativeSource={RelativeSource TemplatedParent}" ...>
hoặc sử dụng TemplateBinding là một phím tắt (*) ở trên
<Border Padding="{TemplateBinding Padding}" ...>
(*) Ngoài việc ít dài dòng hơn trong các kịch bản tạo mẫu này, TemplateBinding có một vài điểm khác biệt so với ràng buộc thông thường:
- Nó được đánh giá tại thời điểm biên dịch. (Ví dụ: nếu thuộc tính Padding không tồn tại, bạn sẽ gặp lỗi biên dịch. Nhưng nếu bạn sử dụng liên kết với TemplatedParent, bạn sẽ chỉ thấy lỗi trong thời gian chạy.)
- Nó luôn là một ràng buộc một chiều.
- Nó yêu cầu cả thuộc tính nguồn và thuộc tính đích đều là thuộc tính phụ thuộc .
- Nó có ít chức năng hơn (không có StringFormat, Delay, IsAsync, v.v. hãy xem các thuộc tính của Binding so với TemplateBindingExtention ).