Как я могу связать с a UserControl
свойство из ResourceDictionary
? Я хочу объект, который я объявляю в своих ресурсах, чтобы иметь то же DataContext
как UserControl
это содержится в:
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Some.Namespace"
DataContext="{Binding Path=ViewModel, RelativeSource={RelativeSource Self}}">
<UserControl.Resources>
<local:SomeClass
x:Key="SomeClass"
DataContext="{Binding Path=DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" />
</UserControl.Resources>
</UserControl>
Во времени выполнения я получаю ошибку:
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='UserControl', AncestorLevel='1''. BindingExpression:Path=DataContext; DataItem=null; target element is 'SomeClass' (Name=''); target property is 'DataContext' (type 'Object')
Я думаю, что вы ищете, это просто {Binding}, который связывается с унаследованным DataContext. Вот пример, хотя немного странно показывает, как вы можете получить цвет через привязку к DataContext:
<Window x:Class="AncestorBinding.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<SolidColorBrush x:Key="MyBrush" Color="Blue" />
</Window.Resources>
<StackPanel>
<Button DataContext="{Binding Source={StaticResource MyBrush}}" Content="My Button">
<Button.Resources>
<Style TargetType="{x:Type Button}">
<Setter Property="Background" Value="{Binding}" />
</Style>
</Button.Resources>
</Button>
</StackPanel>
</Window>
Что я бы сделал, это создать прилагаемое поведение Контроль пользователя и укажите ключ ресурса при этом прилагаемом поведении. Поведение будет нажать на ресурс (не уверен, что вы сможете сделать это на прикреплении, если бы вам не нужно подключить загруженное событие) и передавать контекст данных.
Когда вы добавляете ресурс в визуальное дерево, он должен наследовать контекст данных. Но ... посмотрите на элемент Spy Это может просто сделать то, что вам нужно.
При использовании FindAncestor целевой элемент должен быть потомком (логическим или визуальным) источника. Ваш объект не отображается ни в визуальном, ни в логическом дереве, он просто в ресурсах. Таким образом, вы не можете использовать RelativeSource с FindAncestor для своего объекта.
Вы можете использовать ElementName в своей привязке. Примерно так должно работать:
<UserControl x:Name="userControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Some.Namespace"
DataContext="{Binding Path=ViewModel, RelativeSource={RelativeSource Self}}">
<UserControl.Resources>
<local:SomeClass
x:Key="SomeClass"
DataContext="{Binding Path=DataContext, ElementName=userControl}" />
</UserControl.Resources>
</UserControl>