Когда я привязываю элементы меню к 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>
Поскольку каждая ViewModel в ObservableCollection ManageMenuPageItemViewModels имеет свойства Title и IdCode, приведенный выше код с первого взгляда работает нормально.
ОДНАКО проблема в том, что MenuItem в DataTemplate на самом деле внутри другого MenuItem (как если бы он привязывается дважды), так что в приведенном выше шаблоне данных с Background = "Red" есть красное поле внутри каждого пункта меню strong>, и можно щелкнуть только эту область, а не всю область элемента меню (например, если пользователь щелкает область, где стоит галочка, или справа или слева от внутренней интерактивной области, то ничего не происходит, что, если вы не иметь отдельного цвета очень сбивает с толку.)
Как правильно привязать MenuItems к ObservableCollection ViewModels, чтобы можно было нажимать на всю область внутри каждого MenuItem?
ОБНОВИТЬ:
Итак, я внес следующие изменения, основываясь на приведенном ниже совете, и теперь у меня есть следующее:
http://tanguay.info/web/external/mvvmMenuItemsYellow.png
У меня есть только TextBlock внутри моего DataTemplate, но я все еще не могу «раскрасить весь 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>