2011-09-27 25 views
12

Tôi có một căn bản UserControl mà bộ DataContext của mình cho bản thân để dễ ràng buộc:DataContext Thiết trong UserControl đang ảnh hưởng đến các ràng buộc trong mẹ

<UserControl x:Class="MyControlLib.ChildControl" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 

      DataContext="{Binding RelativeSource={RelativeSource Self}}"> 

</UserControl> 

này được sử dụng trong một tập tin mẹ XAML như thế này:

<UserControl x:Class="MyControlLib.ParentControl" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:ctrl="clr-namespace:MyControlLib"> 

      <ctrl:ChildControl x:Name="ChildName" 
           PropertyOnChild="{Binding PropertyInParentContext}"/>    
</UserControl> 

Vì một lý do nào đó, điều này đưa ra một lỗi ràng buộc dường như chỉ ra rằng DataContext của điều khiển chính bị ảnh hưởng bởi thiết lập điều khiển con của riêng thiết bị DataContext.

System.Windows.Data Error: 40 : BindingExpression path error: 'PropertyInParentContext' property not found on 'object' ''ChildControl' (Name='ChildName')'. BindingExpression:Path=PropertyInParentContext; DataItem='ChildControl' (Name='ChildName'); target element is 'ChildControl' (Name='ChildName'); target property is 'PropertyOnChild' (type 'whatever')

Tại sao "PropertyInParentContext" đang tìm kiếm trong kiểm soát trẻ em chứ không phải trong phụ huynh DataContext?

Nếu tôi loại bỏ các

DataContext="{Binding RelativeSource={RelativeSource Self}} 

từ sự kiểm soát trẻ em, sau đó mọi thứ hoạt động như thế nào tôi mong đợi.

Tôi có thiếu điều gì đó hiển nhiên ở đây không?

Trả lời

11

Việc khai báo điều khiển của bạn và việc khởi tạo cơ bản là thao tác cùng một đối tượng, tất cả các thuộc tính được đặt trong khai báo cũng được đặt trên mọi trường hợp. Vì vậy, nếu các thuộc tính đã được "nhìn thấy" như vậy để nói:

<UserControl x:Class="MyControlLib.ParentControl" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:ctrl="clr-namespace:MyControlLib"> 
    <ctrl:ChildControl x:Name="ChildName" 
         DataContext="{Binding RelativeSource={RelativeSource Self}}" 
         PropertyOnChild="{Binding PropertyInParentContext}"/> 
</UserControl> 

Đây là lý do tại sao bạn không đặt các DataContext của UserControls, nó sẽ ghi đè lên thừa hưởng DataContext (và thậm chí xáo trộn những thực tế rằng có một bối cảnh khác nhau) . Nếu bạn muốn liên kết với các thuộc tính của số UserControl trong khai báo thì hãy đặt tên cho điều khiển và sử dụng các đối tượng ElementName hoặc RelativeSource.

+0

Cảm ơn, tôi đã hiểu lầm phạm vi của các ràng buộc và bài viết của bạn giải thích nó khá tốt. Tôi đã nghĩ rằng XAML của một UserControl là tự chứa, giống như trong một mẫu, nhưng tôi đoán đó là tất cả chỉ là một phần của tài liệu. – GazTheDestroyer

5

Self nghĩa là UserControl, vì vậy khi bạn thiết lập DataContext-Self, bạn đang thiết lập các DataContext đến đối tượng UserControl.

Cú pháp chính xác để liên kết với Điều khiển DataContext sẽ là {Binding RelativeSource={RelativeSource Self}, Path=DataContext}, tuy nhiên vì DataContext được thừa kế bởi Phụ huynh, việc ràng buộc này hoàn toàn không cần thiết trong mọi tình huống.

Ngoài ra, nếu bạn ràng buộc DataContext thành Self.DataContext, về cơ bản bạn sẽ tạo vòng lặp nơi giá trị được ràng buộc với chính nó.

+0

Vâng, đó là chính xác những gì tôi đã cố gắng làm - đặt DataContext thành UserControl. Tôi không hiểu rằng điều này sẽ ảnh hưởng đến các câu lệnh ràng buộc trong điều khiển "cha mẹ". – GazTheDestroyer

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