WPF ContextMenu 使用 ItemsControl,错误地突出显示整个集合

tet*_*ete 2 wpf contextmenu highlight itemscontrol

我需要设计一个ContextMenu包含一个MenuItem,它MenuItem有一个更深层次的菜单列表,它绑定到ObservableCollection我的 ViewModel类型的属性。代码如下所示:

<ContextMenu DataContext="{Binding PlacementTarget.DataContext, 
   RelativeSource={RelativeSource Self}}" >            
   ...                                                                                                                                                     
   <MenuItem Header="Map to account" >
       <ItemsControl ItemsSource="{Binding RelatedAccounts}" >                                        
           <ItemsControl.ItemTemplate>
               <DataTemplate>
                   <MenuItem Header="{Binding Number}" 
                        Command="{Binding PlacementTarget.DataContext.MapToAccountCommand, 
                        RelativeSource={RelativeSource AncestorType=ContextMenu}}"
                        CommandParameter="{Binding}"
                   />                 
               </DataTemplate>
           </ItemsControl.ItemTemplate>                                        
       </ItemsControl>
   </MenuItem>
...
</ContextMenu>
Run Code Online (Sandbox Code Playgroud)

这个想法是当用户从 UI 中右键单击一个支付项目,然后转到“映射到帐户”菜单项时,将显示更深层次的菜单项并列出所有相关帐户供用户选择(如您可以看到ItemsControl绑定到RelatedAccounts)

一切正常,上下文菜单正确显示了我从 ViewModel 公开的所有相关帐户,当用户右键单击一个帐户时,ViewModel 中的Command属性MapToAccountCommand将使用所选帐户的传递参数执行。

但是有一种我不想要的行为:当鼠标进入比“映射到帐户”菜单更深的一层时,它实际上突出显示了整个菜单项集合。请看下面的图片:

在此处输入图片说明

以上是我将鼠标悬停在“美元账户 1”上时的情况

而且即使鼠标没有在任何特定的帐户上,但在更深层次的菜单中的其他区域,高亮效果仍然存在,见图:

在此处输入图片说明

这显然感觉不对。谁能告诉我我做错了什么?谢谢!

dko*_*ozl 5

MemnuItemis 已经ItemsControl因此拥有自己的ItemsSource属性,您可以绑定到该属性。尝试这样的事情:

<MenuItem Header="Map to account" ItemsSource="{Binding RelatedAccounts}" >                                        
     <MenuItem.ItemTemplate>
         <DataTemplate>
             <TextBlock Text="{Binding Number}"/>
         </DataTemplate>
     </MenuItem.ItemTemplate>                                        
     <MenuItem.ItemContainerStyle>
         <Style TargetType="{x:Type MenuItem}">
             <Setter Property="Command" Value="{Binding PlacementTarget.DataContext.MapToAccountCommand, 
                  RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>
             <Setter Property="CommandParameter" Value="{Binding}"/>
         </Style>
     </MenuItem.ItemContainerStyle>
</MenuItem>
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您将其ItemsControl作为MenuItem项目放置,因此 WPF 会将其包裹起来,MenuItem并且您的整体与列表中的其他项目ItemsControl成为一个大项目MenuItemMenuItems