文本菜单中MVVM(ContextMenu in MVVM)

2019-08-17 21:23发布

我想要一个文本菜单绑定到命令的列表。

<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()对列表中的每个命令。

我怎样才能做到这一点的Command中的每个MenuItem称为?

Answer 1:

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

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

让您的视图模型中的集合,其应该得到的背景下操作,如

ObservableCollection<ContextAction> Actions {get;set;}

和简单的这个集合绑定到你的文本菜单。

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

ItemTemplate中的文本菜单项目现在可以访问名字,你可能需要的命令和其他任何。 因此,它会调用与所拥有的元素,而不是用行动本身行动的命令可能是改变CommandParameter藏汉有用。



Answer 2:

我使用的是这样的:

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

在您的ContextMenu的DataContext:

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,所以也许有些语法错误



Answer 3:

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


文章来源: ContextMenu in MVVM