当我使用ObservableCollection来绑定菜单项时,只有“内部”区域的菜单项可以被点击:
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>
由于ObservableCollection中的每个ViewModel都具有Title和IdCode属性,因此上述代码乍一看似乎可以正常工作。 然而,问题在于DataTemplate中的MenuItem实际上是嵌套在另一个MenuItem内部(好像它被绑定了两次),因此在具有Background="Red"的上述DataTemplate中,存在一个红色框在每个菜单项内部,并且只有此区域可以被点击,而不是整个菜单项区域本身(例如,如果用户点击打勾标记所在的区域或内部可点击区域的左侧或右侧,则什么也不会发生,如果没有单独的颜色,这非常令人困惑)。 如何将菜单项绑定到ViewModels的ObservableCollection以使每个MenuItem内部的整个区域都可点击?
更新:
因此,我根据下面的建议做出了以下更改,现在有:
alt text http://tanguay.info/web/external/mvvmMenuItemsYellow.png
我的DataTemplate中只有TextBlock,但我仍然无法"为整个MenuItem着色",而只能为TextBlock着色:
<DataTemplate x:Key="MainMenuTemplate">
<TextBlock Text="{Binding Title}"/>
</DataTemplate>
我把命令绑定放到了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>