2010-04-30 6 views
3

Je suis assez nouveau sur WPF et je me bats un peu avec un scénario. J'ai un menu qui a des éléments de menu. Lorsque l'un de ces éléments de menu est cliqué, une méthode doit être appelée pour faire quelque chose en fonction du texte affiché associé à cet élément de menu. Ainsi, par exemple, le contenu de l'élément de menu était "test", donc je devrais faire quelque chose avec "test". Pour info, ce "quelque chose" affecte directement une collection sur le ViewModel.WPF MenuItem ViewModel Commande

Ceci est facile à réaliser en utilisant l'événement click et aucun ViewModel, mais j'essayais d'implémenter MVVM en utilisant un ViewModel explicite. J'ai donc commencé à regarder dans les commandes, mais je ne vois pas comment je passerais quelque chose de la vue dans la commande dans le ViewModel.

Des suggestions sur ce que je devrais faire ici?

Merci

Répondre

5

Étant donné que vous avez une collection d'éléments de conduite du commandant, je vous conseille d'utiliser quelque chose de similaire à la deuxième suggestion de Will comme ceci:

<MenuItem 
    Command="{Binding MenuCommand}" 
    CommandParameter="{Binding}" 
    Header="{Binding DisplayText}" /> 

Du côté ViewModel vous pouvez utiliser un DelegateCommand ou RelayCommand pour raccorder votre méthode de gestionnaire. Cela vous permet d'inspecter les données de l'élément de menu et de faire ce dont vous avez besoin en fonction de ce qu'il contient.

public DelegateCommand<MyMenuObject> MenuCommand { get; private set; } 

public ViewModel() 
{ 
    MenuCommand = new DelegateCommand<MyMenuObject>(MenuCommandExecuted); 
} 

public void MenuCommandExecuted(MyMenuObject parameter) 
{ 
    // do something based on the parameter object 
} 

Vous aussi besoin de passer soit MenuCommand dans une propriété ICommand sur vos objets de collection à utiliser la forme simple liaison ci-dessus ou changer la commande de liaison à utiliser quelque chose comme un RelativeSource FindAncestor pour rechercher de l'arbre au parent DataContext (ViewModel) pour la commande MenuCommand. Cette approche vous permet d'ajouter ou de supprimer des éléments de la collection sans avoir à modifier l'interface utilisateur pour prendre en charge le nouvel ensemble d'éléments.

Prism DelegateCommand

RelayCommand

2

Vous avez deux choix.

  1. Expose une ICommand pour chaque commande de menu, tels que "FileCommand", "EditCommand", "SaveCommand", etc.
  2. Utilisez le CommandParameter pour envoyer des informations à la commande, comme

< MenuItem Command = "{Binding MenuCommand}" CommandParameter = "fichier"> fichier </MenuItem>

Je pense que la première option est préférable, car il évite les chaînes magiques.

+0

OK, merci pour la réponse. J'ai oublié de mentionner que le texte affiché par les éléments de menu était également lié au ViewModel, c'est-à-dire un ObervableCollection. Cela exclurait certainement le n ° 2. Je ne suis pas sûr de comprendre totalement le n ° 1? Je crée une commande qui implémente l'interface ICommand, mais comment le texte contenu est-il transmis à la commande? Merci encore –

+0

@jon Je suppose que la réponse acceptée vous l'a fait comprendre. – Will

Questions connexes