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>