Ràng buộc mẫu so với ràng buộc là gì?


118

Tôi không thể hiểu được BorderThickness="{TemplateBinding BorderThickness}. Đây là mã:

<ControlTemplate TargetType="{x:Type wpftoolkit:DataGridCell}">
    <Border Padding="{TemplateBinding Padding}" 
            BorderBrush="{TemplateBinding BorderBrush}" 
            BorderThickness="{TemplateBinding BorderThickness}" 
            Background="{TemplateBinding Background}" 
            SnapsToDevicePixels="True">
        <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
    </Border>
</ControlTemplate>

Cũng xin vui lòng giải thích các loại ràng buộc khác.


tại sao sự trở lại này và tại sao BorderThickness viết hai lần "" "BorderThickness =" {TemplateBinding BorderThickness} "" "
prjndhi

1
@Euphoric trang này dường như là kết quả google đầu tiên cho truy vấn đó. ;)
ANeves

Câu trả lời:


204

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 ).

58

Một bưc tranh đang gia ngan lơi noi. Trong trường hợp này, đó là video dài 7 phút: https://www.youtube.com/watch?v=z-0TZR-7xLI

EDIT: Ví dụ:

  • A Buttoncó thuộc ControlTemplatetính mặc định vàHeight bất động sản
  • Bạn ghi đè ControlTemplatethuộc tính của a Buttonbằng cách viết của riêng bạn (ví dụ: bạn muốn tạo Ellipsenút nhìn thay vìRectangle -looking)
  • Sau khi bạn tạo một nút Ellipsemới ControlTemplate, bạn muốn cái Ellipsecó cùng kích thước với Nút ban đầuHeight tính
  • Vì vậy, bạn sử dụng TemplateBindingđể tham khảo ButtonHeightkhông đặt tên nónhập mô tả hình ảnh ở đây

Mặc dù điều này về mặt lý thuyết có thể trả lời câu hỏi, nhưng tốt hơn hết bạn nên đưa các phần thiết yếu của câu trả lời vào đây và cung cấp liên kết để tham khảo.
Bhargav Rao

32

Eren Ersönmenz đã giải thích nó khá tốt, nhưng tôi muốn cung cấp cho nó một góc nhìn khác để hiểu rõ hơn về khái niệm này.

Trong WPF, mọi điều khiển đều ít nhiều tách rời khỏi bản trình bày của nó. Bạn luôn có thể thay đổi mẫu điều khiển và làm cho nó trông hoàn toàn khác. Một nút hoạt động như mong đợi với một ví dụ ControlTemplatechỉ bao gồm một Rectangle. Bây giờ, đôi khi nó là cần thiết ControlTemplateđể thực sự sử dụng các thuộc tính của phần logic của một điều khiển. Và đó TemplateBindinglà những gì dành cho nó chỉ cho biết ControlTemplate"Sử dụng thuộc tính này của điều khiển mà chúng tôi đang trình bày trực quan". Một ví dụ điển hình là thuộc Backgroundtính trên mọi điều khiển, tự nó không có ý nghĩa gì, nó có ý nghĩa đối TemplateBindingvới quyền kiểm soát con trong ControlTemplate.

Sự ràng buộc của chính nó được mô tả rất tốt trong MSDN . Đây là một tờ giấy ăn gian rất đẹp mà trên thực tế được treo trên tường ngay bên cạnh tôi. Nó cung cấp một cái nhìn tổng quan về tất cả các ràng buộc khác nhau có sẵn.


6

Từ tiện ích mở rộng đánh dấu TemplateBinding ,TemplateBinding liên kết giá trị của một thuộc tính trong mẫu điều khiển với giá trị của một số thuộc tính khác được hiển thị trên điều khiển mẫu. Nói cách khác, nó dành cho các giá trị ràng buộc trong một mẫu.

Ràng buộc kết nối một thuộc tính của các mục tiêu ràng buộc và các nguồn dữ liệu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.