MVVM中的ContextMenu

Mar*_*tus 9 c# wpf binding contextmenu mvvm

我想将contextmenu绑定到命令列表.

<Grid.ContextMenu>
    <ContextMenu ItemsSource="{Binding ItemContextCommands, Converter={StaticResource commandToStringConverter}}">
            <ContextMenu.ItemTemplate >
                    <DataTemplate DataType="MenuItem">
                            <MenuItem Command="{Binding}"></MenuItem>
                        </DataTemplate>
                </ContextMenu.ItemTemplate>
        </ContextMenu>
</Grid.ContextMenu>
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能实现Command每个MenuItem被称为?

dow*_*for 16

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

class ContextAction : INotifyPropertyChanged
{
    public string Name;
    public ICommand Action;
    public Brush Icon;
}
Run Code Online (Sandbox Code Playgroud)

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

ObservableCollection<ContextAction> Actions {get;set;}
Run Code Online (Sandbox Code Playgroud)

并简单地将此集合绑定到ContextMenu.

<Grid.ContextMenu>
    <ContextMenu ItemsSource="{Binding Actions}/>
Run Code Online (Sandbox Code Playgroud)

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


bli*_*eis 13

我使用这样的东西:

public class ContextMenuVM
{ 
    public string Displayname {get;set;}
    public ICommand MyContextMenuCommand {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

在您的contextmenu datacontext中:

public ObservableCollection<ContextMenuVM> MyCommandList {get;set;}
Run Code Online (Sandbox Code Playgroud)

在你的xaml中

<ContextMenu ItemsSource="{Binding MyCommandList}">
        <ContextMenu.ItemTemplate >
                <DataTemplate DataType="MenuItem">
                        <MenuItem Header="{Binding Displayname}" Command="{Binding MyContextMenuCommand}"></MenuItem>
                    </DataTemplate>
            </ContextMenu.ItemTemplate>
    </ContextMenu>
Run Code Online (Sandbox Code Playgroud)

它没有ide的写法,所以可能有一些语法错误

  • 此解决方案具有MenuItem的嵌套控件 (3认同)

Ole*_*e K 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>
Run Code Online (Sandbox Code Playgroud)