Pourquoi RelayCommand

j'ai beaucoup programmé dans WPF dernièrement mais ma vue et ma ma maquette ne sont pas séparées à ce point. Eh bien, c'est que partiellement. Toutes mes reliures concernent du texte dans des boîtes de texte, du contenu pour des étiquettes, des listes dans des datagrids, ... sont faits par des propriétés régulières avec un événement NotifyPropertyChanged dans eux.

tous mes événements pour gérer les clics de bouton ou le texte changé des trucs est fait en liant les événements. Maintenant, je voulais commencer à travailler avec les commandes et trouvé cet article: http://www.codeproject.com/Articles/126249/MVVM-Pattern-in-WPF-A-Simple-Tutorial-for-Absolute. Il a une explication sur la façon de configurer MVVM mais je suis confondu avec le RelayCommand.

Quel travail fait-il? Est-il utilisable pour toutes les commandes dans mon formulaire? Comment désactiver le bouton Lorsque (a) certaines zones de texte ne sont pas remplies?


EDIT 1:

une bonne explication de "est-il utilisable pour toutes les commandes dans ma forme?"est la réponse ici: https://stackoverflow.com/a/22286816/3357699

Voici le code que j'ai jusqu'ici: https://stackoverflow.com/a/22289358/3357699

30
demandé sur Community 2014-03-09 22:00:15

2 réponses

Commandes sont utilisées pour séparer la sémantique et l'objet qui invoque une commande de la logique qui exécute la commande c'est-à-dire qu'il sépare le composant UI de la logique qui doit être exécutée sur l'invocation de commande. Ainsi, que vous pouvez tester la logique d'affaires séparément en utilisant des cas de test et aussi votre code D'UI est vaguement couplé à la logique d'affaires.

maintenant, cela étant dit, choisissons vos questions une à une:

quel travail fait-il faire?

j'ai ajouté les détails ci-dessus. Espérons qu'il efface l'utilisation de commandes.


Est-il utilisable pour toutes les commandes dans mon formulaire?

certains contrôles exposent la dépendance de la commande comme Button, MenuItem, etc. qui ont un événement par défaut enregistré. Pour le Bouton Click événement. Donc, si vous liez ICommand déclaré dans ViewModel avec la commande DP du bouton, il sera invoqué chaque fois que le bouton est cliqué sur.

pour les autres événements, vous pouvez lier en utilisant Interactivity triggers. Reportez-vous à la taille de l'échantillon ici comment les utiliser pour se lier à ICommand dans le ViewModel.


comment désactiver le bouton quand(a) certaines zones de texte ne sont pas rempli?

le lien que vous avez posté ne fournit pas la mise en œuvre complète de RelayCommand. Il manque le constructeur surchargé pour définir CanExecute prédicat qui joue un rôle clé dans activer / désactiver le contrôle UI auquel votre commande est liée.

lient les boîtes de textes avec certaines propriétés dans ViewModel et dans CanExecute délégué retourne false si l'un des bindings propriété est null ou vide automatiquement désactivé le contrôle de la commande est affectée.


mise en oeuvre complète de RelayCommand:

public class RelayCommand<T> : ICommand
{
    #region Fields

    readonly Action<T> _execute = null;
    readonly Predicate<T> _canExecute = null;

    #endregion

    #region Constructors

    /// <summary>
    /// Initializes a new instance of <see cref="DelegateCommand{T}"/>.
    /// </summary>
    /// <param name="execute">Delegate to execute when Execute is called on the command.  This can be null to just hook up a CanExecute delegate.</param>
    /// <remarks><seealso cref="CanExecute"/> will always return true.</remarks>
    public RelayCommand(Action<T> execute)
        : this(execute, null)
    {
    }

    /// <summary>
    /// Creates a new command.
    /// </summary>
    /// <param name="execute">The execution logic.</param>
    /// <param name="canExecute">The execution status logic.</param>
    public RelayCommand(Action<T> execute, Predicate<T> canExecute)
    {
        if (execute == null)
            throw new ArgumentNullException("execute");

        _execute = execute;
        _canExecute = canExecute;
    }

    #endregion

    #region ICommand Members

    ///<summary>
    ///Defines the method that determines whether the command can execute in its current state.
    ///</summary>
    ///<param name="parameter">Data used by the command.  If the command does not require data to be passed, this object can be set to null.</param>
    ///<returns>
    ///true if this command can be executed; otherwise, false.
    ///</returns>
    public bool CanExecute(object parameter)
    {
        return _canExecute == null ? true : _canExecute((T)parameter);
    }

    ///<summary>
    ///Occurs when changes occur that affect whether or not the command should execute.
    ///</summary>
    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    ///<summary>
    ///Defines the method to be called when the command is invoked.
    ///</summary>
    ///<param name="parameter">Data used by the command. If the command does not require data to be passed, this object can be set to <see langword="null" />.</param>
    public void Execute(object parameter)
    {
        _execute((T)parameter);
    }

    #endregion
}
56
répondu Rohit Vats 2014-03-09 19:23:27

l'avantage d'utiliser la commande relay est que vous pouvez lier des commandes directement aux modèles de vue. En utilisant des commandes de cette façon, vous évitez d'écrire du code dans le codebehind vues.

lorsque vous utilisez des commandes relais, vous devrez fournir deux méthodes. La première fournit une valeur indiquant si la commande peut être exécutée (par exemple "CanExecuteSave"), tandis que l'autre sera responsable de l'exécution de la commande ("ExecuteSave").

3
répondu Dennis Kassel 2014-03-09 18:53:04