2009-06-22 13 views
32

Ho il seguente file MainView.xaml che funziona bene come un commutatore di menu MVVM. Ho queste coppie:Come posso comunicare al DataTemplate di collegarsi a una proprietà in PARENT ViewModel?

  • Page1View/Page1ViewModel
  • Page2View/Page2ViewModel

nel mio MainViewModel riempio un ObservableCollection con entrambi ViewModels, poi, quando l'utente fa clic Avanti pulsante, chiama NextPageCommand in MainViewModel che interrompe CurrentPageViewModel con un nuovo ViewModel che viene quindi visualizzato yed con una vista appropriata, funziona bene.

Ho anche un menu che viene riempito con tutti i titoli dei ViewModels della collezione Observable, che funziona anche bene.

Tuttavia, ogni Menultem ha un comando = "{Binding SwitchPageCommand}", che dovrebbe chiamare SwitchPageCommand sul MainViewModel e non su esempio Page1ViewModel o Page2ViewModel.

Così come posso indicare nel modello di non legarsi al ViewModel attuale, ma il ViewModel che contiene che ViewModel, per esempio qualcosa di simile:

PSEUDO-CODE: 

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

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

risposta

56

La risposta è questa:

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

ho appena visto che Nir mi aveva dato la sintassi per risolvere il sopra il problema su questa domanda: What is the best way in MVVM to build a menu that displays various pages?.

+1

se potessi votare due volte lo farei. –

Problemi correlati