Доступ к DataContext окна из UserControl - PullRequest
0 голосов
/ 15 апреля 2019

Я немного запутался в 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 ...

1 Ответ

0 голосов
/ 16 апреля 2019

Два варианта, чтобы сделать вашу жизнь проще. Либо передайте виртуальную машину окна в пользовательский элемент управления в качестве переменной (свойство зависимости), либо создайте статическую переменную (возможно, вне приложения), которая будет установлена ​​и будет возвращать виртуальную машину базового окна любому потребителю. Возьмите эту информацию и установите ее как свойство в пользовательском элементе управления, а затем, соответственно, привяжите к этому свойству или свойству зависимости.

...