メニュー項目を ObservableCollection にバインドすると、MenuItem の「内部」領域のみがクリック可能になります。
代替テキスト http://tanguay.info/web/external/mvvmMenuItems.png
私のビューには、次のメニューがあります。
<Menu>
<MenuItem
Header="Options" ItemsSource="{Binding ManageMenuPageItemViewModels}"
ItemTemplate="{StaticResource MainMenuTemplate}"/>
</Menu>
次に、このDataTemplateでバインドします。
<DataTemplate x:Key="MainMenuTemplate">
<MenuItem
Header="{Binding Title}"
Command="{Binding DataContext.SwitchPageCommand,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Menu}}}"
Background="Red"
CommandParameter="{Binding IdCode}"/>
</DataTemplate>
ObservableCollection ManageMenuPageItemViewModelsの各 ViewModel にはプロパティTitleとIdCodeがあるため、上記のコードは一見すると問題なく動作します。
ただし、問題は、DataTemplate のMenuItemが実際には別の MenuItem内にある ( 2 回バインドされているかのように) ため、上記の DataTemplate with Background="Red" では、各メニュー項目内に赤いボックスがあり、この領域のみがあることです。メニュー項目領域自体ではなく、クリックできます (たとえば、ユーザーがチェックマークのある領域、または内側のクリック可能領域の右または左をクリックした場合、何も起こりません。色は非常に紛らわしいです。)
各MenuItem内の領域全体がクリック可能になるように、MenuItemsをViewModelsのObservableCollectionにバインドする正しい方法は何ですか?
アップデート:
そのため、以下のアドバイスに基づいて次の変更を加えたところ、次のようになりました。
代替テキスト http://tanguay.info/web/external/mvvmMenuItemsYellow.png
DataTemplate 内に TextBlock しかありませんが、「MenuItem 全体に色を付ける」ことはできませんが、TextBlock だけです。
<DataTemplate x:Key="MainMenuTemplate">
<TextBlock Text="{Binding Title}"/>
</DataTemplate>
CommandバインディングをMenu.ItemContainerStyleに入れましたが、今は起動しません:
<Menu DockPanel.Dock="Top">
<Menu.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Background" Value="Yellow"/>
<Setter Property="Command" Value="{Binding DataContext.SwitchPageCommand,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Menu}}}"/>
<Setter Property="CommandParameter" Value="{Binding IdCode}"/>
</Style>
</Menu.ItemContainerStyle>
<MenuItem
Header="MVVM" ItemsSource="{Binding MvvmMenuPageItemViewModels}"
ItemTemplate="{StaticResource MainMenuTemplate}"/>
<MenuItem
Header="Application" ItemsSource="{Binding ApplicationMenuPageItemViewModels}"
ItemTemplate="{StaticResource MainMenuTemplate}"/>
<MenuItem
Header="Manage" ItemsSource="{Binding ManageMenuPageItemViewModels}"
ItemTemplate="{StaticResource MainMenuTemplate}"/>
</Menu>