2013-06-14 5 views
0

Je suis en train d'utiliser la coutume delegate commandWPF DelegateCommand RaiseCanExecute

Mais, un RaiseCanExecuteChanged automatique ne fonctionne pas correctement. Est-il agréable d'utiliser CommandManagerHelper (chaque fois que l'application mise au point, il soulève CanExecute changé pour chaque commande? Ou je dois utiliser Standart RelayCommand et augmenter CanExecuteChanged par moi-même?

Merci

Répondre

1

L'événement RaiseCanExecuteChanged ne Codez comme suit (Gardez à l'esprit que cette implémentation d'ICommand n'est pas efficace, mais fonctionne comme un charme):

Il existe une telle implémentation pour chaque interaction de l'interface utilisateur pour actualiser les gestionnaires canExecute pour l'événement RequerySuggested.
public class Command<TArgs> : ICommand 
{ 
    public Command(Action<TArgs> exDelegate) 
    { 
     _exDelegate = exDelegate; 
    } 

    public Command(Action<TArgs> exDelegate, Func<TArgs, bool> canDelegate) 
    { 
     _exDelegate = exDelegate; 
     _canDelegate = canDelegate; 
    } 

    protected Action<TArgs> _exDelegate; 
    protected Func<TArgs, bool> _canDelegate; 

    #region ICommand Members 

    public bool CanExecute(TArgs parameter) 
    { 
     if (_canDelegate == null) 
      return true; 

     return _canDelegate(parameter); 
    } 

    public void Execute(TArgs parameter) 
    { 
     if (_exDelegate != null) 
     { 
      _exDelegate(parameter); 
     } 
    } 

    public event EventHandler CanExecuteChanged 
    { 
     add { CommandManager.RequerySuggested += value; } 
     remove { CommandManager.RequerySuggested -= value; } 
    } 

    bool ICommand.CanExecute(object parameter) 
    { 
     if (parameter != null) 
     { 
      var parameterType = parameter.GetType(); 
      if (parameterType.FullName.Equals("MS.Internal.NamedObject")) 
       return false; 
     } 

     return CanExecute((TArgs)parameter); 
    } 

    void ICommand.Execute(object parameter) 
    { 
     Execute((TArgs)parameter); 
    } 

    #endregion 
} 
+0

Merci, fonctionne très bien. Où puis-je trouver des informations sur le principe principal du fonctionnement de ces commandes? Surtout, à propos de MS.Internal.NamedObject – Alex

+0

Je suggère de regarder dans les bibliothèques MSDN. Je n'ai pas de lien direct cependant. Cette implémentation est assez ancienne, dans un jour où WPF vient d'atteindre la lumière du jour :) –

0

La meilleure solution consiste à utiliser RelayCommand et à augmenter CanExecuteChanged manuellement. Une autre solution ne fonctionne pas correctement.

Questions connexes