2013-06-14 1 views
0

내가 정의 delegate commandWPF DelegateCommand RaiseCanExecute

을 사용하려고하지만, 자동 RaiseCanExecuteChanged가 제대로 작동하지 않습니다. 초점에서 응용 프로그램, 그것은 canexecute을 올릴 때 좋은 모든 명령? 에 대해 변경 CommandManagerHelper (모든 시간을 사용할 수 있나요 아니면 자신의 standart RelayCommand를 사용하여 canexecutechanged 인상해야?

답변

1

RaiseCanExecuteChanged 이벤트가하는

감사합니다 자동화 된 모드에서는 제대로 작동하지 않으므로 RequerySuggested 이벤트에 대한 canExecute 핸들러를 새로 고치는 모든 UI 상호 작용에 대한 구현이 있습니다. 다음과 같은 코드가 있습니다 (ICommand의이 구현은 성능이 좋지 않지만 매력처럼 작동합니다) :

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

감사합니다. 잘 작동합니다. 이 명령의 작동 원리에 대한 정보는 어디에서 찾을 수 있습니까? 특히 MS.Internal.NamedObject에 대해 – Alex

+0

MSDN 라이브러리를 살펴볼 것을 제안합니다. 나는 직접적인 연결이 없다. 이 구현은 꽤 오래된 WPF가 하루의 빛에 도달했을 때의 하루입니다. :) –

0

가장 좋은 해결책은 RelayCommand를 사용하고 CanExecuteChanged를 수동으로 높이는 것입니다. 다른 해결책이 제대로 작동하지 않습니다.

관련 문제