代码之家  ›  专栏  ›  技术社区  ›  Edward Tanguay

如何告诉我的数据模板绑定到父视图模型中的属性?

  •  33
  • Edward Tanguay  · 技术社区  · 16 年前

    我有以下内容 主视图 与MVVM菜单切换器一起工作良好的文件。我有这双:

    • 第1页视图/第1页视图模型
    • page2view/page2view模型

    在我的 主视图模型 我用两个视图模型填充一个可观察的集合,然后当用户单击 接下来 按钮,它调用 下一页页 在主视图模型中,关闭 当前页面视图模型 有了一个新的视图模型,然后用一个合适的视图显示,工作得很好。

    我也有一个菜单,里面充满了可见集合中视图模型的所有标题,这也很好地工作。

    但是,每个菜单项都有一个命令=“binding switchpagecommand”,它应该在 主视图模型 而不是在 PGE1VIEW模型 PaG2VIEW模型 .

    那么,我如何在模板中指示不绑定到当前的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>
    
    1 回复  |  直到 12 年前
        1
  •  56
  •   Community CDub    8 年前

    答案是:

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

    我刚看到NIR给了我解决上述问题的语法: What is the best way in MVVM to build a menu that displays various pages? .