我有一个TabControl
并将其ItemSource
绑定到ObserverableCollection
个视图模型。我还将其DataTemplate
设置为视图模型所支持的视图。
这很好用,ItemContainerStyle
我添加了一个ContextMenu
MenuItem
。如何在我的代码中触发MenuItems
点击事件?我无法在Delete_OnClick
中接听活动。此外,发件人应该是绑定到ItemSource
的{{1}}的视图模型的引用。
TabControl
摘要:我可以右键单击选项卡标题并单击“删除”,但我不会从中获取任何事件。
答案 0 :(得分:1)
我大大改变了原来的答案。
我的理解是你使用MVVM模式。如果是这样,您不应该直接使用事件处理程序。相反,您应该将菜单项绑定到命令。
<ContextMenu>
<MenuItem Header="Delete" Command={Binding MyCommand} />
</ContextMenu>
MyCommand
应该是MyTabItemViewModel
类中定义的属性。
public class MyTabItemViewModel
{
public ICommand MyCommand { get; set; }
...
}
MyCommand
属性可以返回实现ICommand接口的任何类的实例。它可以是预定义的命令(例如,参见ApplicationCommands类)或您自己的命令。以下是您DeleteCommand
的外观示例:
public class DeleteCommand: ICommand
{
private ParentVM Parent { get; set; }
private MyTabItemViewModel Item { get; set; }
public MyCustomCommand (ParentVM parent, MyTabItemViewModel item)
{
Parent= parent;
Item = item;
}
public bool CanExecute(object parameter)
{
return true;
}
public void Execute(object parameter)
{
parent.RemoveItem(item);
}
...
}
我假设您的MyTabItems
集合的视图模型名为ParentVM
,并且它有一个公共方法RemoveItem
,它负责从此集合中删除给定的项目。
您可以在DeleteCommand
的构造函数中实例化MyTabItemViewModel
。例如:
public class MyTabItemViewModel
{
public ICommand MyCommand { get; set; }
public MyTabItemViewModel(ParentVM parent)
{
MyCommand = new DeleteCommand(parent, this);
}
...
}
答案 1 :(得分:1)
请使用EventSetter,它应该适用于您的情况
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="Delete" >
<MenuItem.Style>
<Style TargetType="MenuItem">
<EventSetter Event="Click" Handler="Delete_OnClick"/>
</Style>
</MenuItem.Style>
</MenuItem>
</ContextMenu>
</Setter.Value>
</Setter>