如何将命令绑定到MenuItem(WPF)?

时间:2012-12-11 18:47:05

标签: wpf data-binding command menuitem relaycommand

以下是View.xaml.cs中的代码:

private RelayCommand _closeCommand;
public ICommand CloseCommand
{
    get
    {
        if (_closeCommand == null)
        {
            _closeCommand = new RelayCommand(param => this.OnClose());
        }
        return _closeCommand;
    }
}

public void OnClose()
{
    Close();
}

以下是我的View.xaml中的一些代码:

<Window.ContextMenu>
    <ContextMenu>
        <MenuItem Name="menuItem_Close" Header="Close" Command="{Binding CloseCommand}" />
    </ContextMenu> 
</Window.ContextMenu>

当我运行程序并选择关闭菜单项时,没有任何反应。 CloseCommand代码甚至没有被执行。

3 个答案:

答案 0 :(得分:9)

ContextMenu不是VisualTree的一部分,这就是DataContext不会被继承的原因。这里ContextMenu.PlacementTarget是获取Window的某种转发:

<MenuItem Name="menuItem_Close" Header="Close"
          Command="{Binding Path=PlacementTarget.DataContext.CloseCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}" />

答案 1 :(得分:0)

老问题,新答案。对我来说问题是GalaSoft.MvvmLight.Command.RelayCommand不支持关闭操作。 RelayCommand存储对动作的弱引用,因此闭包几乎立即被释放。该操作必须是模型方法或以其他方式保留。

答案 2 :(得分:-1)

用于绑定交叉可视树,请参阅

Binding Visibility for DataGridColumn in WPF

或者jsut尝试搜索BindingProxy