首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为DataTemplate中的MenuItem指定命令

为DataTemplate中的MenuItem指定命令
EN

Stack Overflow用户
提问于 2009-05-22 16:49:29
回答 2查看 16.7K关注 0票数 20

我有一个上下文菜单。它绑定到某个集合,并且它有一个定义的ItemTemplate,如下所示:

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

itemTemplate是一个带有TextBlock的简单DataTemplate:

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

如何将MenuItem的命令属性绑定到基础对象的属性?

EN

回答 2

Stack Overflow用户

发布于 2012-05-05 03:33:42

虽然这只是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>

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

private void CommandForAll_Executed(object sender, ExecutedRoutedEventArgs e)
{
    var cmdParam = e.Paramater as ExpectedType
    if (cmdParam != null)
        //DoStuff...
}
票数 6
EN

Stack Overflow用户

发布于 2019-12-03 15:30:29

我意识到我是在事后才回答这个问题的,但我遇到了同样的问题,之前的答案似乎使绑定到多个不同的命令变得困难。我得到的解决方案与MatrixManAtYrService非常相似,分为3个部分:

1)使用ItemContainerStyle属性将命令绑定到ViewModel中的命令--这与前面的答案相同。一个例外是我将CommandParameter绑定到MenuItem。

<Setter Property="CommandParameter" Value="{Binding RelativeSource={RelativeSource Self}}"/>

2)创建自定义类来定义每个MenuItem的外观和行为。菜单的ItemsSource将被设置为一个列表。这与其他答案相同。但是,在我的实现中,我为该类指定了一个要在调用MenuItemCommand时执行的操作。我还包含了一个允许禁用MenuItem的布尔值。

public class MenuAction
{
    public string Name { get => name; set => name = value; }
    public Action Action { get => action; set => action = value; }
    public bool CanExecute { get => canExecute; set => canExecute = value; }
}

3)在命令实现中,将控制路由到MenuAction中的代理。

public void HandleCommand(object sender)
{
    MenuItem clickedMenuItem = sender as MenuItem;
    MenuAction menuAction = clickedMenuItem?.DataContext as MenuAction;
    if(menuAction != null)
        menuAction.Action();
}

public bool CanMenuItemExecute(object sender)
{
    MenuItem clickedMenuItem = sender as MenuItem;
    MenuAction menuAction = clickedMenuItem?.DataContext as MenuAction;
    if (menuAction != null)
        return menuAction.CanExecute;
    else
        return false;
}

这应该允许您在列表中定义命令的所有行为。虽然它在技术上绑定到单个命令,但在功能上类似于拥有多个不同的命令。同样的方法也适用于嵌套的MenuItems和HierarchicalDataTemplates,但需要进行一些调整。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/898852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档