Я немного запутался в DataContext в моем тестовом приложении. Я создал приложение с двумя разными пользовательскими элементами управления. Эти UserControls имеют свои собственные DataContext, которые устанавливаются в их собственных ViewModels. Я не могу получить доступ к DataContext из MainWindow, где отображаются пользовательские элементы управления.
Вот код xaml для MainWindow:
<Window x:Class="TestUserControl.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TestUserControl"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="500">
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<StackPanel>
<local:MainUserControl VerticalAlignment="Top" HorizontalAlignment="Center"/>
<ContentControl>
<ContentControl.Style>
<Style TargetType="ContentControl">
<Style.Triggers>
<DataTrigger Binding="{Binding ActiveView}" Value="Example 1">
<Setter Property="Content">
<Setter.Value>
<local:UserControl1 />
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding ActiveView}" Value="Example 2">
<Setter Property="Content">
<Setter.Value>
<local:UserControl2 />
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</StackPanel>
Как вы можете заметить, я переключаю UserControl в соответствии с переменной ActiveView - и он отлично работает.
Код моего UserControls выглядит следующим образом:
<UserControl x:Class="TestUserControl.UserControl2"
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:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:TestUserControl"
Name="UC2"
mc:Ignorable="d"
d:DesignHeight="250" d:DesignWidth="500">
<UserControl.Resources>
<local:UserControl2ViewModel x:Key="vm2" />
</UserControl.Resources>
<UserControl.DataContext>
<Binding Source="{StaticResource vm2}" />
</UserControl.DataContext>
<Grid Width="500" Height="250" Background="Green">
<StackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
<StackPanel Orientation="Horizontal">
<Label Content="I am from "/>
<TextBlock Background="AliceBlue" Text="{Binding Path=DataContext.ActiveView, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Window}}}"/>
</StackPanel>
</StackPanel>
</Grid>
Итак, когда я запускаю свое приложение, возникает ошибка:
Ошибка System.Windows.Data: 4: не удается найти источник для привязки со ссылкой 'RelativeSource FindAncestor,
AncestorType = 'System.Windows.Window', AncestorLevel = '1' '.
BindingExpression: Path = DataContext.ActiveView; DataItem = NULL; цель
Элемент 'TextBlock' (Name = ''); целевое свойство 'Текст' (тип
'Строка')
и я не знаю почему. Я нашел много примеров, как получить доступ к DataContext предка, но все они выглядели как то, что я написал в свойстве Text в элементе TextBlock ... Отчаянно я пытался изменить положение Path и относительное свойство источника, но вы знаете - результат был тот же. Я даже пытался изменить тип Ancestor на локальный: MainWindow, просто Window (без x: Type) и т. Д. - но вы знаете - результат был таким же.
Можете ли вы помочь мне с этим? Где я сделал ошибку? Я просто хочу, чтобы мои UserControls имели свой собственный DataContext + получить некоторые значения из DataContext of Window ...