2009-07-15 27 views

Trả lời

195

TemplateBinding không hoàn toàn giống nhau. Tài liệu MSDN thường được viết bởi những người phải kiểm tra các SDE đơn sắc về các tính năng của phần mềm, do đó các sắc thái không hoàn toàn đúng.

MẫuBìm kiếm được đánh giá tại thời gian biên dịch dựa vào loại được chỉ định trong mẫu điều khiển. Điều này cho phép tạo nhanh các mẫu được biên dịch nhanh hơn nhiều. Chỉ cần fumble tên trong một templatebinding và bạn sẽ thấy rằng trình biên dịch sẽ gắn cờ nó.

Đánh dấu ràng buộc được giải quyết khi chạy. Trong khi chậm hơn để thực thi, ràng buộc sẽ giải quyết các tên thuộc tính không hiển thị trên loại được khai báo bởi khuôn mẫu. Bởi chậm hơn, tôi sẽ chỉ ra rằng loại tương đối của nó kể từ khi hoạt động ràng buộc mất rất ít cpu của ứng dụng. Nếu bạn đã nổ mìn các mẫu kiểm soát xung quanh ở tốc độ cao, bạn có thể nhận thấy nó.

Như một vấn đề thực tế, hãy sử dụng TemplateBinding khi bạn có thể nhưng đừng sợ Binding.

+17

Vì vậy, chính nên nhớ: Thời gian biên dịch so với Thời gian chạy. TemplateBinding sẽ không hoạt động nếu bạn thử thay đổi trong suốt thời gian chạy. Đúng ? –

+2

Cũng lưu ý rằng việc sử dụng Binding thay vì TemplateBinding có thể có tác động như những gì bạn thấy trong Thời gian thiết kế. Trong các cấu hình nhất định, các thuộc tính bị ràng buộc sử dụng {Binding RelativeSource ...} sẽ không xuất hiện trong trình thiết kế (mặc dù chúng vẫn hiển thị trong suốt thời gian chạy), nhưng nếu bạn chuyển sang sử dụng {TemplateBinding ...}, các thuộc tính đó được đánh giá trong thời gian thiết kế. – lfalin

15

TemplateBinding là viết tắt của Ràng buộc với TemplatedParent nhưng nó không tiếp xúc với tất cả khả năng của các lớp Binding, ví dụ bạn không thể kiểm soát Binding.Mode từ TemplateBinding.

1

Tôi nghĩ TemplateBinding không hỗ trợ các loại Freezable (bao gồm các đối tượng cọ vẽ). Để giải quyết vấn đề. Người ta có thể sử dụng TemplatedParent

18

Một điều nữa - TemplateBindings không cho phép chuyển đổi giá trị. Chúng không cho phép bạn chuyển đổi một Trình chuyển đổi và không tự động chuyển đổi chuỗi int thành chuỗi (ví dụ như bình thường đối với một Ràng buộc).

+1

Cảm ơn Miroslav, đây là vấn đề tôi gặp phải, việc chuyển sang sử dụng TemplatedParent đã giải quyết được vấn đề. – MikeKulls

27

TemplateBinding - Nhiều hạn chế so với sử dụng thường xuyên Binding

  • More hiệu quả hơn một Ràng buộc nhưng nó có chức năng ít
  • Chỉ làm việc bên trong cây thị giác của một ControlTemplate
  • Không làm việc với tài sản trên Freezables
  • Không hoạt động trong Trình kích hoạt của ControlTemplate
  • Cung cấp lối tắt trong cài đặt g thuộc tính (không phải là tiết), ví dụ:{TemplateBinding targetProperty}

Regular Binding - Không có ở trên giới hạn của TemplateBinding

  • Thuộc tính Tôn Trọng Chánh
  • Resets Target giá trị rõ ràng ra bất kỳ thiết lập một cách rõ ràng giá trị
  • Ví dụ: < Ellipse Fill = "{Binding RelativeSource = {RelativeSource TemplatedParent}, Đường dẫn = nền}"/>
2

RelativeSource TemplatedParent

Chế độ này cho phép gắn một tài sản ControlTemplate trao cho một thuộc tính của điều khiển mà các ControlTemplate được áp dụng cho. Để hiểu rõ vấn đề ở đây là một ví dụ dưới đây

<Window.Resources> 
    <ControlTemplate x:Key="template"> 
     <Canvas> 
      <Canvas.RenderTransform> 
       <RotateTransform Angle="20"/> 
      </Canvas.RenderTransform> 
      <Ellipse Height="100" Width="150" 
        Fill="{Binding 
       RelativeSource={RelativeSource TemplatedParent}, 
       Path=Background}"> 

      </Ellipse> 
      <ContentPresenter Margin="35" 
         Content="{Binding RelativeSource={RelativeSource 
         TemplatedParent},Path=Content}"/> 
     </Canvas> 
    </ControlTemplate> 
</Window.Resources> 

<Canvas Name="Parent0"> 
    <Button Margin="50" 
       Template="{StaticResource template}" Height="0" 
       Canvas.Left="0" Canvas.Top="0" Width="0"> 
     <TextBlock FontSize="22">Click me</TextBlock> 
    </Button> 
</Canvas> 

Nếu tôi muốn áp dụng các đặc tính của một điều khiển cho mẫu kiểm soát thì tôi có thể sử dụng chế độ TemplatedParent. Ngoài ra còn có một phần mở rộng tương tự với phần mở rộng đánh dấu này là TemplateBinding là một loại ngắn của cái đầu tiên, nhưng TemplateBinding được đánh giá tại thời gian biên dịch ở độ tương phản của TemplatedParent được đánh giá ngay sau lần chạy đầu tiên. Như bạn có thể nhận xét trong hình dưới đây, nền và nội dung được áp dụng từ bên trong nút đến mẫu điều khiển.

Các vấn đề liên quan