2010-08-22 3 views
3

Je lis Josh Smith WPF Apps With The Model-View-ViewModel Design Pattern tutorielBesoin d'aide pour comprendre MVVM Tutorial, RelayCommand et utilisation des lambdas

Je ne comprends pas ce que le code ci-dessous tente de faire.
D'abord, la syntaxe me rappelle les propriétés, mais avec add/remove à la place. Mais qu'est-ce que CommandManager.RequerySuggested?

Il délègue la souscription d'événement pour l'événement CommandManager.RequerySuggested . Cela garantit que l'infrastructure commandant WPF demande à tous objets RelayCommand si elles peuvent exécuter chaque fois qu'il demande au haut- commandes

//Figure 3 The RelayCommand Class 
public class RelayCommand : ICommand 
{ 
#region Fields 
    readonly Action<object> _execute; 
    readonly Predicate<object> _canExecute; 
#endregion // Fields 
#region Constructors 
public RelayCommand(Action<object> execute) : this(execute, null) 
{ } 
public RelayCommand(Action<object> execute, Predicate<object> canExecute) 
{ 
    if (execute == null) throw new ArgumentNullException("execute"); 
    _execute = execute; 
    _canExecute = canExecute; 
} 
#endregion // Constructors 
#region ICommand Members 
[DebuggerStepThrough] 
public bool CanExecute(object parameter) 
{ 
    return _canExecute == null ? true : _canExecute(parameter); 
} 
public event EventHandler CanExecuteChanged 
{ 
    add { CommandManager.RequerySuggested += value; } 
    remove { CommandManager.RequerySuggested -= value; } 
} 
public void Execute(object parameter) 
{ _execute(parameter); } 
#endregion // ICommand Members } 

En outre, commande de sauvegarde est configuré avec lambdas. 1er, il y a 2 variables param. Vont-ils en conflit? Je ne peux pas faire quelque chose comme RelayCommand(this.Save(), this.CanSave) ou est-ce qu'il n'y a pas une telle syntaxe.

_saveCommand = new RelayCommand(param => this.Save(), 
           param => this.CanSave); 
+0

Cela pourrait vous aider. http://stackoverflow.com/questions/2281566/is-josh-smiths-implementation-of-the-relaycommand-flawed –

Répondre

3
  1. CommandManager.RequerySuggested += value signifie que si la fonction pour CanExecute peut résoudre à la fois true et false selon certaines conditions.

    WPF désactive le Button/MenuItem (CommandButtonBase) si elle est évaluée à false et permettre à chaque fois que la condition est évaluée à true.
    Si vous ne disposez pas de ces deux lignes, WPF demandera la commande qu'une seule fois (lorsque le bouton /MenuItem est chargé et ne sera pas mise à jour après que

  2. à moins que vous le faites manuellement. Les deux paramètres (lambda-expressions) sont de type Action<object> et Predicate<object> respectivement donc, ils ne peuvent pas, par définition, les conflits (params est juste un nom -. et que les deux fonctions ont une portée différente - ils ne sont pas en conflit)

    Si. vous avez une méthode avec la bonne signature, vous pouvez l'utiliser dans le constructeur

    • private void Save(object obj)
      et
      private bool CanSave(object obj)

    respectivement, mais vous ne devriez pas avoir le () à la fin - si nouvelle RelayCommand(this.Save,this.CanSave) devrait fonctionner.

+0

1 chose que je ne comprends pas à propos de 'CanExecuteChanged' est l'ajout/suppression. il me semble un getter/setter, quand j'ajoute un gestionnaire d'événement pour 'CanExecuteChanged' je l'ajoute aussi à l'événement' CommandManager.RequerySuggested'. même pour enlever? mais vous dites que la valeur peut évaluer à vrai/faux. Alors, quel est l'ajout/suppression en fait? En supposant aussi que value est bool, comment 'CommandManager' sait-il quel contrôle désactiver? –

+0

L'ajout/suppression est ce qui se passe chaque fois que quelque chose ajoute une commande. CanExecuteChanged + = SomeRoutine (et - = bien sûr). Ainsi, chaque fois que le moteur WPF ajoute un gestionnaire à la commande (c'est ce qui se passe lorsque vous l'ajoutez à la propriété Command d'un bouton derrière les scènes), nous ajoutons un hook à CommandManager - ce hook contient la valeur (ie le bouton) et le Commande - et ensuite après, lorsque CommandManager décide que CanExecute a changé, CanExecute peut être différent - il demande au bouton de demander à la commande le nouveau CanExecute - déshabilitant ainsi le bouton. – Goblin

Questions connexes