11

我想将上下文菜单绑定到命令列表。

<Grid.ContextMenu>
    <ContextMenu ItemsSource="{Binding ItemContextCommands, Converter={StaticResource commandToStringConverter}}">
            <ContextMenu.ItemTemplate >
                    <DataTemplate DataType="MenuItem">
                            <MenuItem Command="{Binding}"></MenuItem>
                        </DataTemplate>
                </ContextMenu.ItemTemplate>
        </ContextMenu>
</Grid.ContextMenu>

简单地将命令列表转换为对列表中的每个命令commandToStringConverter调用的字符串列表。ToString()

我怎样才能实现Commandin eachMenuItem被调用?

4

3 回答 3

20

我会使用一个小的“视图模型”来保存这样一个命令的信息。

class ContextAction : INotifyPropertyChanged
{
    public string Name;
    public ICommand Action;
    public Brush Icon;
}

在您的视图模型中创建一个集合,该集合应该获得上下文操作,例如

ObservableCollection<ContextAction> Actions {get;set;}

并简单地将这个集合绑定到你的ContextMenu.

<Grid.ContextMenu>
    <ContextMenu ItemsSource="{Binding Actions}" />

上下文菜单项现在ItemTemplate可以访问名称、命令以及您可能需要的任何其他内容。更改也可能很有用,CommandParameter以便它将使用操作拥有元素调用命令,而不是使用操作本身。

于 2013-03-22T09:44:45.597 回答
14

我使用这样的东西:

public class ContextMenuVM
{ 
    public string Displayname {get;set;}
    public ICommand MyContextMenuCommand {get;set;}
}

在您的上下文菜单数据上下文中:

public ObservableCollection<ContextMenuVM> MyCommandList {get;set;}

在你的xml中

<ContextMenu ItemsSource="{Binding MyCommandList}">
        <ContextMenu.ItemTemplate >
                <DataTemplate DataType="MenuItem">
                        <MenuItem Header="{Binding Displayname}" Command="{Binding MyContextMenuCommand}"></MenuItem>
                    </DataTemplate>
            </ContextMenu.ItemTemplate>
    </ContextMenu>

它是在没有 ide 的情况下编写的,所以可能存在一些语法错误

于 2013-03-22T09:48:37.477 回答
7

@blindmils 解决方案的改进 XAML 版本如下:

<ContextMenu ItemsSource="{Binding MyCommandList}">
    <ContextMenu.ItemContainerStyle>
        <Style TargetType="MenuItem">
            <Setter Property="Header" Value="{Binding Displayname}" />
            <Setter Property="Command" Value="{Binding MyContextMenuCommand }" />
        </Style>
    </ContextMenu.ItemContainerStyle>
</ContextMenu>
于 2016-04-21T08:46:32.393 回答