TabControl标题上的WPF上下文菜单

时间:2016-01-19 13:22:15

标签: c# wpf xaml contextmenu tabcontrol

我有一个TabControl并将其ItemSource绑定到ObserverableCollection个视图模型。我还将其DataTemplate设置为视图模型所支持的视图。

这很好用,ItemContainerStyle我添加了一个ContextMenu MenuItem。如何在我的代码中触发MenuItems点击事件?我无法在Delete_OnClick中接听活动。此外,发件人应该是绑定到ItemSource的{​​{1}}的视图模型的引用。

TabControl

摘要:我可以右键单击选项卡标题并单击“删除”,但我不会从中获取任何事件。

2 个答案:

答案 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>