2

我需要设计一个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>

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

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

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

在此处输入图像描述

以上是我将鼠标放在“USD Account 1”上时的情况

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

在此处输入图像描述

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

4

1 回答 1

6

MemnuItem因此is 已经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>

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

于 2013-07-03T13:30:40.843 回答