2012-05-15 52 views
86

Tôi không thể hiểu được BorderThickness="{TemplateBinding BorderThickness}. Ở đây mã:Mẫu ràng buộc với ràng buộc là gì?

<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 vui lòng giải thích các loại ràng buộc khác.

+0

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

+0

@Euphoric trang này có vẻ là kết quả đầu tiên của google cho truy vấn đó. ;) – ANeves

Trả lời

151

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}" ...> 

có nghĩa là liên kết thuộc tính đệm của đường biên với thuộc tính đệm 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 cho." Bạn không thể cho nó một cái tên bởi vì bạn không biết x: Tên của điều khiển vào lúc này (ngay cả khi bạn đã làm, nó sẽ không hoạt động vì nó trong một tên khác). Tuy nhiên, bạn có thể làm điều này bằng cách định nghĩa 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 (*) cho trên

<Border Padding="{TemplateBinding Padding}" ...> 

(*) Ngoài việc là ít tiết trong các trường hợp tạo mẫu này, TemplateBinding có một vài khác biệt so với liên kết thông thường:

  • Đượ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ẽ nhận được một lỗi biên dịch. Nhưng nếu bạn sử dụng một ràng buộc với TemplatedParent, bạn sẽ chỉ thấy lỗi khi chạy.)
  • Nó luôn luôn là một cách ràng buộc.
  • Yêu cầu cả thuộc tính nguồn và mục tiêu là thuộc tính phụ thuộc.
  • Có chức năng ít hơn nhiều (không có StringFormat, Delay, IsAsync, v.v. xem các thuộc tính của Binding so với TemplateBindingExtention).
5

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

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

29

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

Trong WPF, mọi điều khiển đều bị 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 số ControlTemplate chỉ bao gồm một ví dụ Rectangle. Bây giờ đôi khi nó là cần thiết cho các 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à đó là những gì TemplateBinding là cho nó chỉ nói với các ControlTemplate "Sử dụng tài sản này của kiểm soát chúng tôi đang đưa ra các bài thuyết trình trực quan". Một ví dụ tốt là thuộc tính Background trên mọi điều khiển, nó không có ý nghĩa riêng của nó, nó có ý nghĩa của nó bằng cách TemplateBinding nó để kiểm soát trẻ em trong ControlTemplate.

Việc tự ràng buộc được mô tả rất tốt ở số MSDN. This là một tờ báo rất tốt đẹp mà trên thực tế treo trên tường của tôi ngay bên cạnh tôi. Nó cung cấp một cái nhìn tổng quan tốt về tất cả các ràng buộc khác nhau có sẵn.

27

Một hình ảnh đáng giá 1000 từ. Trong trường hợp này nó là 7 phút video: https://www.youtube.com/watch?v=z-0TZR-7xLI

EDIT: Ví dụ:

  • Một Button có thuộc tính mặc định ControlTemplateHeight tài sản
  • Bạn ghi đè ControlTemplate tài sản của một Button bằng cách viết của bạn của riêng bạn (ví dụ: bạn muốn thực hiện một nút Ellipse-tìm kiếm thay vì Rectangle-tìm kiếm)
  • Sau khi bạn đã thực hiện một Ellipse in new ControlTemplate của bạn, bạn muốn Ellipse để có kích thước tương tự như tài sản Height gốc Button
  • Vì vậy, bạn sử dụng TemplateBinding để tham khảo Button 's Height mà không đặt tên nó enter image description here
+0

Trong khi điều này về mặt lý thuyết có thể trả lời câu hỏi, [nó sẽ là thích hợp hơn] (// meta.stackoverflow.com/q/8259) để bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. –

+1

Cảm ơn bạn đã chỉnh sửa. Tôi có thể upvote ngay bây giờ :-) –

+2

Cảm ơn vì hình ảnh :) – Guillaume07