在DataTemplate中为MenuItem指定命令

arc*_*aut 19 wpf command datatemplate

我有一个上下文菜单.它绑定到一些集合,它有一个定义的ItemTemplate,如下所示:

<ContextMenu
    ItemsSource={Binding ...}
    ItemTemplate={StaticResource itemTemplate}
    />
Run Code Online (Sandbox Code Playgroud)

itemTemplate是一个带TextBlock的简单DataTemplate:

<DataTemplate x:Key="itemTemplate">
    <TextBlock Text={Binding ...} />
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

如何将MenuItem的Command属性绑定到底层对象的属性?

Mar*_*ris 24

我认为你需要将TextBlock包装在MenuItem中:

<DataTemplate x:Key="itemTemplate">
    <MenuItem Command={Binding ...}>
        <TextBlock Text={Binding ...} />
    </MenuItem>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

但是我现在没有在我面前试用这个IDE.让我知道事情的后续.


看起来你需要使用ItemContainerStyle所看到这里.很抱歉在开始的时候引导你走错了路 - 但是我在IDE前面这是有效的:

<ContextMenu.ItemContainerStyle>
    <Style TargetType="MenuItem">
        <Setter Property="Command" Value="{Binding ...}"/>
    </Style>
</ContextMenu.ItemContainerStyle>
Run Code Online (Sandbox Code Playgroud)

  • 这会创建双重MenuItem,它可以提升样式!不要以为这是一个合适的答案! (5认同)
  • 实际上,这会将TextBlock添加到MenuItem的Items集合中.它还将MenuItem放在另一个MenuItem中. (3认同)
  • 如果有多个menuitem并且我们需要将菜单项与单个命令绑定,该怎么办? (3认同)

Mat*_*ice 6

虽然这只是Martin Harris回答的一个细微变化,但我还是认为我会分享它.我发现为整个集合指定一个命令更有用,并且还发送一个CommandParameter:

<MenuItem.ItemContainerStyle>
    <Style TargetType="MenuItem">
       <Setter Property="Command" Value="{x:Static v:ViewModel.CommandForAll}"/>
       <Setter Property="CommandParameter" Value="{Binding ValueForCommand}"/>
    </Style>
</MenuItem.ItemContainerStyle>
Run Code Online (Sandbox Code Playgroud)

然后,您可以确定在命令的处理程序中执行的操作:

private void CommandForAll_Executed(object sender, ExecutedRoutedEventArgs e)
{
    var cmdParam = e.Paramater as ExpectedType
    if (cmdParam != null)
        //DoStuff...
}
Run Code Online (Sandbox Code Playgroud)