[英]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.