J'ai suivantes MainView.xaml fichier qui fonctionne bien comme MVVM menu switcher. J'ai ces paires:
- Page1View / Page1ViewModel
- Page2View / Page2ViewModel
dans mon MainViewModel - je remplir une ObservableCollection avec les deux Viewmodel, ensuite, lorsque l'utilisateur clique sur le Prochain bouton, il appelle NextPageCommand dans MainViewModel qui bascule hors CurrentPageViewModel avec un nouveau ViewModel qui est alors affiché avec une Vue appropriée, fonctionne très bien.
J'ai aussi un Menu rempli avec tous les titres de la Viewmodel dans la collection Observable, qui fonctionne aussi bien.
Cependant, chaque MenuItem a une Commande="{Binding SwitchPageCommand}" qui DEVRAIT appeler SwitchPageCommand sur le MainViewModel et pas sur, par exemple, Page1ViewModel ou Page2ViewModel.
Alors, comment puis-je indiquer dans le modèle à ne pas se lier à l'actuel ViewModel mais le ViewModel qui contient que ViewModel, par exemple, quelque chose comme ceci:
PSEUDO-CODE:
<DataTemplate x:Key="CodeGenerationMenuTemplate">
<MenuItem
Command="{Binding <parentViewModel>.SwitchPageCommand}"
Header="{Binding Title}"
CommandParameter="{Binding Title}"/>
</DataTemplate>
Voici 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>