我有一个上下文菜单。它绑定到某个集合,并且它有一个定义的ItemTemplate,如下所示:
<ContextMenu
ItemsSource={Binding ...}
ItemTemplate={StaticResource itemTemplate}
/>
itemTemplate是一个带有TextBlock的简单DataTemplate:
<DataTemplate x:Key="itemTemplate">
<TextBlock Text={Binding ...} />
</DataTemplate>
如何将MenuItem的命令属性绑定到基础对象的属性?
发布于 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...
}
发布于 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,但需要进行一些调整。
https://stackoverflow.com/questions/898852
复制相似问题