Подтвердить что ты не робот

Как я могу передать свой DataTemplate для привязки к свойству в PARENT ViewModel?

У меня есть следующий файл MainView.xaml, который отлично работает в качестве переключателя меню MVVM. У меня эти пары:

  • Page1View/Page1ViewModel
  • Page2View/Page2ViewModel

в моем MainViewModel Я заполняю ObservableCollection как с помощью ViewModels, а затем, когда пользователь нажимает кнопку Далее, он вызывает NextPageCommand в MainViewModel, который отключает CurrentPageViewModel с новой ViewModel, которая затем отображается с соответствующим представлением, прекрасно работает.

У меня также есть Меню, заполняемое всеми заголовками из ViewModels в коллекции Observable, которое также прекрасно работает.

Однако каждый элемент MenuItem имеет команду = {{Binding SwitchPageCommand} ", которая ДОЛЖНА вызывать SwitchPageCommand на MainViewModel, а не на. Page1ViewModel или Page2ViewModel.

Итак, как я могу указать в шаблоне не привязываться к текущему ViewModel, а ViewModel, который содержит этот ViewModel, например. что-то вроде этого:

PSEUDO-CODE:

<DataTemplate x:Key="CodeGenerationMenuTemplate">
    <MenuItem 
        Command="{Binding <parentViewModel>.SwitchPageCommand}" 
        Header="{Binding Title}" 
        CommandParameter="{Binding Title}"/>
</DataTemplate>

Здесь MainViewModel:

<Window x:Class="TestMenu234.Views.MainView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:c="clr-namespace:TestMenu234.Commands"
    xmlns:vm="clr-namespace:TestMenu234.ViewModels"
    xmlns:v="clr-namespace:TestMenu234.Views"
    Title="Main Window" Height="400" Width="800">

    <Window.Resources>
        <DataTemplate x:Key="CodeGenerationMenuTemplate">
            <MenuItem Header="{Binding Title}" Command="{Binding SwitchPageCommand}" CommandParameter="{Binding Title}"/>
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:Page1ViewModel}">
            <v:Page1View/>
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:Page2ViewModel}">
            <v:Page2View/>
        </DataTemplate>
    </Window.Resources>

    <DockPanel>

        <Menu DockPanel.Dock="Top">
            <MenuItem Header="Code _Generation" ItemsSource="{Binding AllPageViewModels}"
                      ItemTemplate="{StaticResource CodeGenerationMenuTemplate}"/>
        </Menu>

        <StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
            <Button Margin="5" Content="Next Page" Command="{Binding NextPageCommand}"/>
        </StackPanel>

        <ContentControl
            Content="{Binding CurrentPageViewModel}"/>

    </DockPanel>
</Window>
4b9b3361

Ответ 1

Ответ таков:

<DataTemplate x:Key="CodeGenerationMenuTemplate">
    <MenuItem 
        Header="{Binding Title}" 
        Command="{Binding DataContext.SwitchPageCommand,
    RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Menu}}}" 
        CommandParameter="{Binding Title}"/>
</DataTemplate>

Я только что увидел, что Нир дал мне синтаксис для решения вышеупомянутой проблемы по этому вопросу: Каким образом MVVM лучше всего построить меню, отображающее различные страницы?.