我怎么能告诉我的DataTemplate绑定到父视图模型的属性?(How can I tell my

2019-06-23 20:39发布

我有一个MVVM菜单切换行之有效以下MainView.xaml文件。 我有这些对:

  • Page1View / Page1ViewModel
  • Page2View / Page2ViewModel

在我MainViewModel我填一个ObservableCollection两者的ViewModels,然后当用户点击下一步按钮,它调用NextPageCommand在MainViewModel其中切换了CurrentPageViewModel一个新的视图模型,然后用适当的视图中显示,很好地工作。

我也有一个菜单充满从观察集合,这也很好地工作在所有的ViewModels的标题。

然而,每个菜单项有一个命令=“{结合SwitchPageCommand}”,其应该调用SwitchPageCommand上MainViewModel而不是例如Page1ViewModelPage2ViewModel。

所以,我怎么可以在模板中表示不绑定到当前视图模型,但其中包含的视图模型视图模型认为,例如,像这样:

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>

Answer 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建立各种显示页面菜单中的最佳方式? 。



文章来源: How can I tell my DataTemplate to bind to a property in the PARENT ViewModel?