2013-08-16 34 views
6

Đối với một sự hiểu biết tốt hơn về các ràng buộc WPF:Styles và Bindings trong WPF

<Style x:Key="myButton" TargetType="Button"> 
    <Setter 
    Property="Content" 
    Value="{Binding 
      RelativeSource={RelativeSource FindAncestor,AncestorType=My:Control}, 
      Path=Text}"> 
    </Setter> 
</Style> 

<Button Name="button1" Style="{StaticResource myButton}"></Button> 
<Button Name="button2" Style="{StaticResource myButton}"></Button> 

Khi tôi sử dụng phong cách này trên nhiều nút, tôi giả sử Style chỉ là những người khởi tạo. Nó có ý nghĩa gì đối với sự ràng buộc? Tôi chỉ có một Ràng buộc (tức là một đối tượng ràng buộc) và nút1 và button2 đang tham chiếu đến đối tượng ràng buộc này? Nếu vậy, khi nào và như thế nào là Nguồn của Ràng buộc được xác định khi button1 và button2 được sử dụng như một phần của các điều khiển My: Control khác nhau? Bởi vì tôi có nghĩa là tham chiếu đến các đối tượng nguồn không phải là giá trị của nguồn? Ai đó có thể chỉ cho tôi một số đặc điểm kỹ thuật mà điều này được nêu?

Trả lời

2

tôi giả Style chỉ là những

Vâng, đây là bằng chứng về rằng việc sử dụng mã của bạn instantiated

enter image description here

Tôi chỉ có một ràng buộc (tức là một đóng-Object) và button1 và button2 đang tham chiếu đến đối tượng Binding-này?

Có, vì kiểu giữ liên kết và các đối tượng giống nhau (nghĩa đen) thì ràng buộc phải giống nhau.

enter image description here

Nếu vậy, khi nào và như thế nào là nguồn của các ràng buộc được xác định khi button1 và button2 được sử dụng như một phần của tôi khác nhau: điều khiển kiểm soát?

Thời gian: Khi cây hình ảnh được render các ràng buộc được đánh giá bằng cách đi bộ đến kiểm soát theo quy định của FindAncestor

Làm thế nào: Bây giờ bạn đang nói về chi tiết thực hiện. Trong khi tôi không biết chính xác có bao FindAncestor công trình (một chiều để xem là thông qua NET Reflector), nó có thể sử dụng VisualTreeHelper.GetParent(...)

EDIT:

các BindingExpression không được gắn với Binding của đối tượng , nhưng bạn có thể dễ dàng có được nó như thế này.

enter image description here

Đúng như dự đoán, cả hai nút có khác nhau BindingExpression nhưng Binding cùng một đối tượng. BindingExpression liên kết số Target với Source. Trong trường hợp này, ResolvedSource là null như là kết quả của việc sử dụng RelativeSource để tìm tài sản

enter image description here

+0

tôi hỏi những qestion cùng cho bạn bè. Ông giải thích rằng có một sự khác biệt giữa BindingExpression và một đối tượng Binding. Những gì tôi đã chỉ định trong Style là BindingExpression. Và kể từ khi Style chỉ được khởi tạo một lần, BindingExpression có lẽ là tốt. Vì vậy, cả hai nút tham chiếu cùng BindingExpression. Tại một số thời điểm trong khi thực thi BindingExpression được đánh giá và một đối tượng Binding được tạo ra. Trong quá trình tạo này, FindAncestor được đánh giá dựa trên vị trí hiện tại của nút trong cây.Ở cuối mỗi nút có đối tượng ràng buộc riêng và khác nhau của nó. – user1182735

+0

Nói chung lời giải thích này phù hợp với lời giải thích của bạn, nhưng với một chi tiết nhỏ. Sự khác biệt giữa đối tượng Binding và đối tượng BindingExpression. – user1182735

+1

Cả hai nút đều tham chiếu cùng một ràng buộc, nhưng cả hai nút sẽ không có cùng 'BindingExpression' vì' BindingExpression' chứa thông tin về 'Mục tiêu'. – Shoe

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