繁体   English   中英

MVVM 中的上下文菜单

[英]ContextMenu in MVVM

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

<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()

如何实现调用每个MenuItem中的Command

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

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

我使用这样的东西:

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

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

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

在你的 xaml 中

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

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

下面是@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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM