我正在尝试使用MVVM将ObservableCollection绑定到ContextMenu。但是,当我试图发射命令时,没有任何事情发生。另外,我需要将字符串作为命令参数传递给事件。
以下是xaml代码:
<ContextMenu Name="ctxAddApplication" ItemsSource="{Binding Path=ApplicationTypes}">
<ContextMenu.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}">
<Setter Property="Command" Value="{Binding AddRequirementCommand}"/>
<Setter Property="CommandParameter" Value="{Binding}"/>
</Style>
</ContextMenu.ItemContainerStyle>
</ContextMenu>
以下是查看型号代码:
public ObservableCollection<string> ApplicationTypes { get; private set; }
public ComposableCommand AddRequirementCommand { get; private set; }
this.AddRequirementCommand = new ComposableCommand(this.AddRequirementView);
private void AddRequirementView(object applicationName) {}
请帮助!!!
答案 0 :(得分:2)
每个菜单项的数据上下文将是它所绑定的任何内容。在您的情况下,一个字符串,因为您的ApplicationTypes
属性是字符串的集合。因此,设置命令的绑定将不起作用,因为类型AddRequirementCommand
上没有String
属性。
答案 1 :(得分:2)
以防您需要代码:
<ContextMenu Name="ctxAddApplication" ItemsSource="{Binding Path=ApplicationTypes}">
<ContextMenu.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}">
<Setter Property="Command" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}, Path=DataContext.AddRequirementCommand}"/>
<Setter Property="CommandParameter" Value="{Binding}"/>
</Style>
</ContextMenu.ItemContainerStyle>
</ContextMenu>
答案 2 :(得分:0)
每个项目的ContextMenu视图内部都绑定到集合中的项目。
<Setter Property="Command" Value="{Binding AddRequirementCommand}" />
这将尝试在字符串类中找到“AddRequirementCommand”。在此绑定中使用RelativeSource。还可以使用VS调试器和输出窗口来查看绑定错误,它通常会有很多帮助。