2013-03-12 14 views
11

Đây là tình huống phổ biến trong các ứng dụng dựa trên XAML (WPF/Silverlight/WinRT).Cách truy cập DataContext của cha mẹ trong Cửa sổ 8 lưu trữ ứng dụng

WPF liên quan liên kết ->WPF Databinding: How do I access the "parent" data context?

RelativeSource với AncestorType, và Mode=FindAncestor thường đến để giải thoát trong WPF.

Cả hai thứ này đều bị thiếu trong API WinRT. Làm thế nào để truy cập vào của phụ huynh (có thể không phải là ngay lập tức), DataContext?

(Tôi biết TemplateBindingElementBinding nhưng cả hai đều không phù hợp chủ yếu trong DataTemplate).

Trả lời

19

Tôi vừa gặp sự cố tương tự. Có lẽ điều này là phổ biến ??

Dưới đây là một giải pháp thô mà hoạt động:

  • Bind Tag tài sản của một yếu tố cấp cao nhất để DataContext

    <Grid Name="gridTop" Tag="{Binding}" /> 
    
  • Bind thuộc tính bạn muốn qua ElementName trong phần tử lồng nhau, tức là

    {Binding Tag.SomeProp, ElementName=gridTop} 
    
+1

Đề nghị tốt, nhưng đây là [ElementBinding] (http://www.rhyous.com/2010/04/13/tutorial-binding-one-element-property-to-another/). Nó không hoạt động bên trong [DataTemplate] (http://sblanco.wordpress.com/2010/01/29/wpf-bind-to-a-parent-datacontext-from-within-a-datatemplate/). Hành vi được đính kèm dường như là cách để đi. – Tilak

+1

Nó hoạt động bên trong DataTemplate - bạn đang ràng buộc với Thẻ của phần tử (parent), có tham chiếu đến DataContext mẹ. Tôi sử dụng tất cả thời gian từ bên trong các phần tử DataTemplate để liên kết với DataContext cấp cao nhất. – LMK

+11

Bạn có thể đơn giản hóa việc này bằng cách xóa Thẻ và chỉ sử dụng dữ liệu văn bản trực tiếp {Binding DataContext.SomeProp, ElementName = gridTop} – oXeNoN

1

Ràng buộc ElementName vẫn có thể và có thể hoạt động trong trường hợp của bạn. Nếu không, bạn cần phải thực hiện một hành vi đính kèm.

0

Có một số cách bạn có thể đối phó với vấn đề này:

ElementName ràng buộc là phương pháp phổ biến nhất, như Filip chỉ ra.

Bạn có thể đi bộ cây thị giác cho đến khi bạn tìm thấy cha mẹ. Đó là những gì FindAcestor thực hiện trong nội bộ. Bạn có thể ăn mặc nó trong hành vi để tái sử dụng dễ dàng.

Nếu bạn sử dụng các mô hình xem, bạn có thể sử dụng tin nhắn thay vì liên kết hoặc bạn có thể thêm ngữ cảnh gốc cho mỗi mô hình xem trẻ em.

Chọn giải pháp tốt nhất sẽ tùy thuộc vào hoàn cảnh cụ thể của bạn.