MVVMメニュースイッチャーとして適切に機能する次のMainView.xamlファイルがあります。私はこれらのペアを持っています:
私のMainViewModelでObservableCollectionに両方のViewModelを入力し、ユーザーがNextボタンをクリックすると、MainViewModelでNextPageCommandが呼び出されます- CurrentPageViewModel新しいViewModelを使用すると、適切なビューで表示され、適切に機能します。
また、ObservableコレクションのViewModelsのすべてのタイトルがメニューに表示されています。これもうまく機能します。
ただし、各MenuItemにはCommand = "{Binding SwitchPageCommand}"があり、MainViewModelでSwitchPageCommandを呼び出す必要があります。 Page1ViewModelまたはPage2ViewModel。
つまり、現在のViewModelにバインドするのではなく、containsそのViewModelを含むViewModelをテンプレートでどのように示すことができますか。たとえば、次のようになります。
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>
答えはこれです:
<DataTemplate x:Key="CodeGenerationMenuTemplate">
<MenuItem
Header="{Binding Title}"
Command="{Binding DataContext.SwitchPageCommand,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Menu}}}"
CommandParameter="{Binding Title}"/>
</DataTemplate>
Nirがこの問題に関する上記の問題を解決するための構文を提供してくれたのを見ました: MVVMでさまざまなページを表示するメニューを作成する最良の方法は何ですか? 。