代码之家  ›  专栏  ›  技术社区  ›  arconaut

为datatemplate中的menuitem指定命令

  •  19
  • arconaut  · 技术社区  · 16 年前

    我有上下文菜单。它已绑定到某些集合,并且具有如下定义的项模板:

    <ContextMenu
        ItemsSource={Binding ...}
        ItemTemplate={StaticResource itemTemplate}
        />
    

    itemTemplate是一个简单的带有文本块的数据模板:

    <DataTemplate x:Key="itemTemplate">
        <TextBlock Text={Binding ...} />
    </DataTemplate>
    

    如何将menuitem的command属性绑定到基础对象的属性?

    2 回复  |  直到 10 年前
        1
  •  24
  •   Martin Harris    16 年前

    我认为您需要将文本块包装在菜单项中:

    <DataTemplate x:Key="itemTemplate">
        <MenuItem Command={Binding ...}>
            <TextBlock Text={Binding ...} />
        </MenuItem>
    </DataTemplate>
    

    但是我现在没有一个IDE在我面前尝试这个。告诉我进展如何。


    看起来您需要使用itemcontainerStyle,如图所示 here .很抱歉在一开始就把你引错了路-但我在一个IDE前面,这很有效:

    <ContextMenu.ItemContainerStyle>
        <Style TargetType="MenuItem">
            <Setter Property="Command" Value="{Binding ...}"/>
        </Style>
    </ContextMenu.ItemContainerStyle>
    
        2
  •  6
  •   MatrixManAtYrService    13 年前

    虽然这只是马丁·哈里斯回答的一个细微的变化,但我还是想和大家分享一下。我发现它更有用:为整个集合指定一个命令,并发送一个命令参数:

    <MenuItem.ItemContainerStyle>
        <Style TargetType="MenuItem">
           <Setter Property="Command" Value="{x:Static v:ViewModel.CommandForAll}"/>
           <Setter Property="CommandParameter" Value="{Binding ValueForCommand}"/>
        </Style>
    </MenuItem.ItemContainerStyle>
    

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

    private void CommandForAll_Executed(object sender, ExecutedRoutedEventArgs e)
    {
        var cmdParam = e.Paramater as ExpectedType
        if (cmdParam != null)
            //DoStuff...
    }
    
    推荐文章