动态绑定文本菜单项静态定义的MenuItems(Dynamically binding Contex

2019-10-19 17:50发布

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

我知道的一组我在编译时支持所有的命令,所以理论上我可以定义一个<MenuItem>与资源x:Key属性在我的每个人<TreeView.Resources>部分。 然而,对于被点击任何给定的节点,该节点出现的菜单项只能在运行时确定。 我可以绑定ContextMenu.ItemsSource在我的应用程序的东西,返回MenuItem[]但为了建立这个数组,然后,我会需要访问被定义静态早在XAML文件中的MenuItems。

我做这一切错了吗? 或者是有没有办法做我想做什么?

Answer 1:

绑定你ContextMenu.ItemsSource而不是一个菜单项[],但一个的ObservableCollection <YourMenuClass>。 YourMenuClass应包含要绑定的头和其他参数,也许是命令。 然后使用模板来生成您的菜单项。

   <ContextMenu ItemsSource="{Binding MenuItemList}">
            <ContextMenu.ItemTemplate>
                <DataTemplate>
                    <MenuItem Header="{Binding Path=Name}" Command="{Binding MyCommand}" />
                </DataTemplate>
            </ContextMenu.ItemTemplate>
    </ContextMenu>


Answer 2:

而不是使用一个ItemTemplate的,上下文菜单提供ItemContainer风格。 这样就可以避免在上面留言,当中提到其内的另一个菜单项的问题。

       `<ContextMenu.ItemContainerStyle>
            <Style TargetType="{x:Type MenuItem}">
                <Setter Property="Header" Value="{Binding Name}"/>
            </Style>
        </ContextMenu.ItemContainerStyle>`


文章来源: Dynamically binding ContextMenu items to statically defined MenuItems