将ContextMenu项动态绑定到静态定义的MenuItems

时间:2014-04-03 20:15:33

标签: wpf wpf-controls

我的应用程序包含一个TreeView,它支持一组命令,但命令可能在菜单之间移动,只出现在某些菜单上而不出现在其他菜单上,在多个菜单中共享等等。

我知道我在编译时支持的所有命令集,所以理论上我可以在<MenuItem>部分为每个命令定义一个x:Key属性<TreeView.Resources>属性。但是,对于单击的任何给定节点,出现的菜单项只能在运行时确定。我可以将ContextMenu.ItemsSource绑定到我的应用程序中返回MenuItem[]的内容,但是为了构建这个数组,我需要访问在XAML文件中静态定义的MenuItem。

我这样做是错的吗?或者有办法做我想做的事吗?

2 个答案:

答案 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>`