2009-06-22 81 views
32

我有以下MainView.xaml文件,可以很好地作为一个MVVM菜单切换器。我有这些对:如何告诉我的DataTemplate绑定到PARENT ViewModel中的属性?

  • Page1View/Page1ViewModel
  • Page2View/Page2ViewModel

在我MainViewModel我填一个ObservableCollection两者的ViewModels,那么当用户点击下一页按钮,它调用NextPageCommand在MainViewModel中切换出CurrentPageViewModel与一个新的ViewModel然后显示用适当的视图进行操作,效果很好。

我也有一个菜单被Observable集合中的ViewModels的所有标题填充,这也很好地工作。但是,每个MenuItem都有一个Command =“{Binding SwitchPageCommand}”,它应该在MainViewModel上调用SwitchPageCommand,而不是在例如。 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> 

回答

56

答案是这样的:

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

我刚才看到尼尔给我的语法来解决以上问题在这个问题上:What is the best way in MVVM to build a menu that displays various pages?

+1

如果我可以两次投票,我会。 – 2012-01-11 02:31:03