【发布时间】:2009-07-01 08:14:36
【问题描述】:
当我将菜单项与 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>
由于 ObservableCollection ManageMenuPageItemViewModels 中的每个 ViewModel 都有一个属性 Title 和 IdCode,所以上面的代码乍一看可以正常工作。
然而,问题是DataTemplate中的MenuItem实际上是inside另一个MenuItem(好像它被绑定了两次),因此在上面带有 Background="Red" 的 DataTemplate 中,每个菜单项内都有一个 红色框 并且只有这个区域可以被点击,而不是整个菜单项区域本身(例如,如果用户点击复选标记所在的区域或内部可点击区域的右侧或左侧,则没有任何反应,这,如果没有单独的颜色是很混乱的。)
将 MenuItems 绑定到 ViewModel 的 ObservableCollection 以使每个 MenuItem 内的整个区域都可点击的正确方法是什么?
更新:
所以我根据以下建议进行了以下更改,现在有了这个:
alt text 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>
【问题讨论】:
标签: wpf xaml mvvm datatemplate menuitem