我的应用程序包含一个TreeView
,它支持一组命令,但命令可能在菜单之间移动,只出现在某些菜单上而不出现在其他菜单上,在多个菜单中共享等等。
我知道我在编译时支持的所有命令集,所以理论上我可以在<MenuItem>
部分为每个命令定义一个x:Key
属性<TreeView.Resources>
属性。但是,对于单击的任何给定节点,出现的菜单项只能在运行时确定。我可以将ContextMenu.ItemsSource
绑定到我的应用程序中返回MenuItem[]
的内容,但是为了构建这个数组,我需要访问在XAML文件中静态定义的MenuItem。
我这样做是错的吗?或者有办法做我想做的事吗?
答案 0 :(得分:3)
将ContextMenu.ItemsSource绑定到MenuItem []但不绑定到ObservableCollection&lt; YourMenuClass&gt;。 YourMenuClass应包含要绑定的标头和其他参数,可能是命令。然后使用模板生成菜单项。
<ContextMenu ItemsSource="{Binding MenuItemList}">
<ContextMenu.ItemTemplate>
<DataTemplate>
<MenuItem Header="{Binding Path=Name}" Command="{Binding MyCommand}" />
</DataTemplate>
</ContextMenu.ItemTemplate>
</ContextMenu>
答案 1 :(得分:0)
为上下文菜单提供ItemContainer样式,而不是使用Itemtemplate。这样,您可以避免出现上述评论中提到的菜单项位于另一个项内部的问题。
`<ContextMenu.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}">
<Setter Property="Header" Value="{Binding Name}"/>
</Style>
</ContextMenu.ItemContainerStyle>`