2012-12-11 12 views
7

Ecco il mio codice dal View.xaml.cs:Come si associa un comando a un MenuItem (WPF)?

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

public void OnClose() 
{ 
    Close(); 
} 

Ed ecco qualche codice dal mio View.xaml:

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

Quando eseguo il programma e selezionare la voce di menu Chiudi , non accade nulla. Il codice CloseCommand non viene nemmeno eseguito.

+0

Hai impostato il DataContext? –

+0

Ho trovato la soluzione al mio problema. Stavo usando un ViewModel che aveva una proprietà in esso che era un altro tipo ViewModel e avevo bisogno di ricondurre a quello corretto facendo questo: 'Command =" {Binding ActiveVM.CloseCommand} "' –

+0

Ho trovato una soluzione alla tua domanda [http://stackoverflow.com/questions/898852/specify-command-for-menuitem-in-a-datatemplate/18362041#18362041][1] [1]: http: // StackOverflow. it/questions/898852/specificare-comando-per-menuitem-in-a-datatemplate/18362041 # 18362041 – Jacksquad

risposta

8

ContextMenu non fa parte del VisualTree, ecco perché lo DataContext non verrà ereditato. Qui ContextMenu.PlacementTarget è una sorta di staffetta per ottenere il Window:

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

Sei sicuro di non avere il 'DataContext'? Nel mio test sembra che erediti il ​​DataContext come ti aspetteresti ... – McGarnagle

+0

Ho provato il tuo codice per Command = "..." ma non ha funzionato, proprio come prima, non è successo nulla. –

+0

@dbaseman Secondo [questo] (http://msdn.microsoft.com/en-us/library/ms749018.aspx#PopupandtheVisualTree) Popup crea il proprio albero visivo. Ciò significa nessuna ereditarietà DataContext per ContextMenu che viene inserita in una finestra popup. – LPL

0

vecchia questione, nuova risposta . Per me il problema era che GalaSoft.MvvmLight.Command.RelayCommand non supportava le chiusure per l'azione. RelayCommand memorizza un riferimento debole all'azione in modo che una chiusura venga deallocata quasi immediatamente. L'azione deve essere un metodo modello o essere mantenuta in qualche altro modo.