2012-12-11 13 views
7

Hier ist mein Code aus dem View.xaml.cs:Wie binden Sie einen Befehl an ein MenuItem (WPF)?

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

public void OnClose() 
{ 
    Close(); 
} 

Und hier ist ein Code von meinem View.xaml:

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

Wenn ich das Programm ausführen, und wählen Sie den Menüpunkt Beenden , nichts passiert. Der CloseCommand-Code wird nicht einmal ausgeführt.

+0

Haben Sie den DataContext festgelegt? –

+0

Ich habe die Lösung für mein Problem gefunden. Ich benutzte ein ViewModel, das eine Eigenschaft hatte, die ein anderer ViewModel-Typ war, und ich musste auf diese Eigenschaft beschränken, indem ich Folgendes tat: 'Command =" {Binding ActiveVM.CloseCommand} "' –

+0

Ich habe eine Lösung für Ihre Frage gefunden [http://stackoverflow.com/questions/898852/specify-command-for-menuitem-in-a-datatemplate/18362041#18362041][1] [1]: http: // Stackoverflow. com/questions/898852/specify-command-for-menuitem-in-a-datatemplate/18362041 # 18362041 – Jacksquad

Antwort

8

ContextMenu ist nicht Teil des VisualTree, deshalb wird DataContext nicht vererbt. Hier ContextMenu.PlacementTarget eine Art Relais ist die Window zu bekommen:

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

Sind Sie sicher, dass der 'DataContext' nicht angezeigt wird? In meinem Test scheint es, den DataContext zu erben, wie Sie erwarten würden ... – McGarnagle

+0

Ich versuchte Ihren Code für das Command = "...", aber es hat nicht funktioniert - gerade wie vorher - nichts geschah. –

+0

@dbaseman Nach [diesem] (http://msdn.microsoft.com/en-us/library/ms749018.aspx#PopupandtheVisualTree) erstellt Popup einen eigenen VisualTree. Dies bedeutet keine DataContext-Vererbung für ContextMenu, die in einem Popup platziert wird. – LPL

0

Alte Frage, neue Antwort . Für mich war das Problem, dass GalaSoft.MvvmLight.Command.RelayCommand Schließungen für die Aktion nicht unterstützt. RelayCommand speichert einen schwachen Verweis auf die Aktion, so dass ein Abschluss fast sofort aufgehoben wird. Die Aktion muss eine Modellmethode sein oder auf andere Weise beibehalten werden.

Verwandte Themen