Wpf 如何让DataTemplate绑定到父视图模型中的属性?

Wpf 如何让DataTemplate绑定到父视图模型中的属性?,wpf,data-binding,xaml,mvvm,Wpf,Data Binding,Xaml,Mvvm,我有以下MainView.xaml文件,可以作为MVVM菜单切换器使用。我有这双: Page1View/Page1ViewModel Page2View/Page2ViewModel 在myMainViewModel中,我用两个ViewModel填充一个ObservableCollection,然后当用户单击Next按钮时,它在MainViewModel中调用NextPageCommand,该命令用新的ViewModel关闭CurrentPageViewModel,然后以适当的视图显示,效果

我有以下MainView.xaml文件,可以作为MVVM菜单切换器使用。我有这双:

  • Page1View/Page1ViewModel
  • Page2View/Page2ViewModel
在myMainViewModel中,我用两个ViewModel填充一个ObservableCollection,然后当用户单击Next按钮时,它在MainViewModel中调用NextPageCommand,该命令用新的ViewModel关闭CurrentPageViewModel,然后以适当的视图显示,效果很好

我还有一个菜单,里面充满了Observable集合中ViewModels的所有标题,这也很好地工作

但是,每个菜单项都有一个命令=“{Binding SwitchPageCommand}”,它应该在MainViewModel上调用SwitchPageCommand,而不是在Page1ViewModelPage2ViewModel上调用

那么我如何在模板中指示不绑定到当前ViewModel,而是绑定到包含该ViewModel的ViewModel,例如类似这样的内容:

PSEUDO-CODE:

<DataTemplate x:Key="CodeGenerationMenuTemplate">
    <MenuItem 
        Command="{Binding <parentViewModel>.SwitchPageCommand}" 
        Header="{Binding Title}" 
        CommandParameter="{Binding Title}"/>
</DataTemplate>
伪代码:
以下是主视图模型:

<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>

答案是:

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

我刚刚看到Nir给了我解决上述问题的语法: