Mam podstawowe UserControl
który ustawia swój DataContext
sobie łatwość wiązania:Ustawianie DataContext w UserControl wpływa powiązania z rodzicem
<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>
ta jest wykorzystywana w pliku rodzic XAML tak:
<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>
Z jakiegoś powodu daje to błąd wiążący, który wydaje się wskazywać, że ustawienie kontroli podrzędnej ma wpływ na ustawienie DataContext
kontroli rodzicielskiej: 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')
Dlaczego „PropertyInParentContext” bycie szuka w kontroli dziecka niż w macierzystej DataContext
?
Jeśli usunąć
DataContext="{Binding RelativeSource={RelativeSource Self}}
od kontroli dziecka, potem wszystko działa jak by się spodziewać.
Czy brakuje tu czegoś oczywistego?
Dzięki, nie zrozumiałem zakresu wiązań i twój post wyjaśnił to całkiem dobrze. Myślałem, że XAML z UserControl jest samowystarczalny, jak w szablonie, ale myślę, że to tylko część dokumentu. – GazTheDestroyer