Когда я связываю элементы меню с ObservableCollection, только "внутренняя" область MenuItem доступна для кликов:
alt text 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 имеет свойство Заголовок и IdCode, приведенный выше код отлично работает с первого взгляда.
ОДНАКО, проблема заключается в том, что MenuItem в DataTemplate на самом деле внутри другого MenuItem (, как если бы он был привязан дважды), так что в приведенном выше DataTemplate с Фон = "Красный" есть красный флаг внутри каждого пункта меню, и только эта область может быть нажата, а не вся область самого пункта меню (например, если пользователь нажимает на область, где находится галочка, или справа или слева от внутренней области, которой можно щелкнуть), ничего не происходит, что, если у вас нет отдельного цвета, очень сбивает с толку. )
Каков правильный способ привязки MenuItems к ObservableCollection ViewModels, чтобы вся область внутри каждого MenuItem была доступна для кликов?
UPDATE:
Итак, я сделал следующие изменения, основанные на приведенном ниже совете, и теперь имею следующее:
alt text 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>