WPF MVVM ContextMenu绑定到ObservableCollection <string>命令不触发</string>

时间:2011-01-20 09:59:47

标签: wpf mvvm contextmenu bind

我正在尝试使用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) {}

请帮助!!!

3 个答案:

答案 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调试器和输出窗口来查看绑定错误,它通常会有很多帮助。