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 に答える