2012-12-11 53 views
7

下面是從View.xaml.cs我的代碼:如何將一個命令綁定到MenuItem(WPF)?

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代碼甚至不會被執行。

+0

您是否設置了DataContext? –

+0

我找到了解決我的問題的方法。我正在使用一個ViewModel,它有一個屬性是另一個ViewModel類型,我需要通過這樣做來縮小範圍:'Command =「{Binding ActiveVM.CloseCommand}」' –

+0

我找到了解決您的問題的方法[http://stackoverflow.com/questions/898852/specify-command-for-menuitem-in-a-datatemplate/18362041#18362041][1] [1]:HTTP://計算器。 com/questions/898852 /指定命令爲menuitem-in-a-datatemplate/18362041#18362041 – Jacksquad

回答

8

ContextMenu不是VisualTree的一部分,這就是爲什麼DataContext不會被繼承。這裏ContextMenu.PlacementTarget某種繼電器獲得Window

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

你確定它沒有得到'DataContext'?在我的測試中,它似乎是繼承DataContext,就像你期望的那樣... – McGarnagle

+0

我嘗試了Command =「...」的代碼,但它沒有工作 - 就像以前一樣 - 沒有發生任何事情。 –

+0

@dbaseman根據[this](http://msdn.microsoft.com/en-us/library/ms749018.aspx#PopupandtheVisualTree)Popup創建自己的visualtree。這意味着放置在Popup中的ContextMenu沒有DataContext繼承。 – LPL

0

老問題,新的答案。對我來說,問題是GalaSoft.MvvmLight.Command.RelayCommand不支持該操作的關閉。 RelayCommand存儲對動作的弱引用,以便幾乎立即釋放閉包。該行爲必須是模型方法或以其他方式保留。

相關問題