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>
se potessi votare due volte lo farei. –