9

这是我在 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 代码甚至没有被执行。

4

3 回答 3

11

ContextMenu不是 VisualTree 的一部分,这就是为什么DataContext不会被继承。这ContextMenu.PlacementTarget是某种继电器来获得Window

<MenuItem Name="menuItem_Close" Header="Close"
          Command="{Binding Path=PlacementTarget.DataContext.CloseCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}" />
于 2012-12-11T19:38:03.407 回答
0

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

于 2016-09-20T19:23:20.020 回答
-1

绑定交叉视觉树,参考

WPF 中 DataGridColumn 的绑定可见性

或者 jsut 尝试搜索 BindingProxy

于 2016-04-08T02:51:12.180 回答