C# 无法将WPF菜单绑定到ItemsSource

C# 无法将WPF菜单绑定到ItemsSource,c#,wpf,binding,menuitem,itemssource,C#,Wpf,Binding,Menuitem,Itemssource,我希望通过绑定到ICommand派生对象的列表,避免在XAML或代码中手动构建菜单。但是,我遇到了一个问题,结果菜单有两个级别的菜单项(即每个MenuItem包含在MenuItem中): 我猜这是因为WPF正在为我的绑定自动生成一个MenuItem,但我使用的“查看器”实际上已经是一个MenuItem(它来自MenuItem): (ItemContainerStyleSelector来自,它允许我在绑定的源代码中包含分隔符元素。) 因此,菜单被绑定到ICommands的集合,并且每个项的

我希望通过绑定到
ICommand
派生对象的列表,避免在XAML或代码中手动构建菜单。但是,我遇到了一个问题,结果菜单有两个级别的菜单项(即每个
MenuItem
包含在
MenuItem
中):

我猜这是因为WPF正在为我的绑定自动生成一个
MenuItem
,但我使用的“查看器”实际上已经是一个
MenuItem
(它来自
MenuItem
):


(ItemContainerStyleSelector来自,它允许我在绑定的源代码中包含
分隔符
元素。)

因此,菜单被绑定到
ICommand
s的集合,并且每个项的
CommandParameter
被设置为相同的全局目标(这恰好是一个集合,但这并不重要)


我的问题是,是否有任何方法可以绑定它,使WPF不会自动将每个项包装到
菜单项中?

不幸的是,我发现解决此问题的最佳方法是为菜单项使用样式,而不是使用ItemTemplate。然后样式中的每个特性都可以绑定到对象上的特性。例如,类似这样的事情:

<Style x:Key="SelectionContextMenuStyle" TargetType="MenuItem">
    <Setter Property="Header" Value="{Binding Path=Text}" />
    <Setter Property="Command" Value="{Binding Path=Command}" />
    <Setter Property="CommandParameter" Value="{Binding Path=Parameter}" />
</Style>


似乎ItemTemplate应该可以工作,这是更好的方法,但这是我发现的唯一可以正常工作的方法。

我倾向于将ContextMenu子类化并覆盖GetContainerForItemOverride:

public class ContextMenuWithNoteCommands : ContextMenu
{
  protected virtual DependencyObject GetContainerForItemOverride()
  {
    return new NoteCommandMenuItemViewer();
  }
}
然后在NoteCommandMenuItemViewer样式或ContextMenu.ItemContainerStyle(以更合适的为准)中设置CommandParameter绑定

这假设您不能简单地在常规菜单项上使用ItemContainerStyle来获得想要的效果:

<ContextMenu ...>
  <ContextMenu.ItemContainerStyle>
    <Style>
      ...
    </Style>
  </ContextMenu.ItemContainerStyle>
</ContextMenu>

...

不管怎么说,这就是我的NoteCommandMenuItemViewer类所做的,所以我认为这样做并不是一个可怕的损失。谢谢,这是一个更简单的解决方案!
<ContextMenu ...>
  <ContextMenu.ItemContainerStyle>
    <Style>
      ...
    </Style>
  </ContextMenu.ItemContainerStyle>
</ContextMenu>