2012-07-01 7 views
6

Я учусь MVVM для C# развития Silverlight отRelayCommand в C#

http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

и я смущен о классе RelayCommand упоминается в контексте. Код:

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 
} 

За что я не очень понимаю, как _execute и _canExecute работы в этом случае. (Я новичок в C# и даже не уверен, что это действие и предикат. Я знаю, что они являются делегатами, но чем разница между ними и как они работают?)
А также в программе, я не получила линию

add { CommandManager.RequerySuggested += value; } 
    remove { CommandManager.RequerySuggested -= value; } 

Может кто-нибудь дать мне объяснение об этом, спасибо!

ответ

2

RelayCommand требует двух частей информации:

  1. Какой код должен выполняться при выполнении команды (_execute действий)
  2. Какой код должен работать, чтобы определить, является ли эта команда может быть выполнена (в _canExecute предикат)

Action является делегатом, представляющим метод, который возвращает void. В этом случае действие _execute принимает один параметр (object) и возвращает void.

A Predicate - это делегат, который принимает значение и возвращает логический результат. В этом случае предикат _canExecute принимает значение object и возвращает bool.

Оба _execute и _canExecute значения подаются на RelayCommand, когда он построен, потому что эти части команды, которые являются уникальными для каждой отдельной команды.

Что касается CanExecuteChanged события:

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

Когда абонент подписывается на событие, add называется и когда они отменить подписку, remove называется. Вышеописанное событие CanExecuteChanged - это просто сквозное событие (то есть, если абонент подписывается на событие CanExecuteChanged, они автоматически подписываются на событие CommandManager.RequerySuggested). По словам MSDN, в CommandManager.RequerySuggested случае ...

происходит, когда CommandManager определяет условия, которые могут изменить способность команды для выполнения.

Я считаю, что абонент, скорее всего, вызвать CanExecute метод на RelayCommand, когда это событие вызывается, чтобы определить, если команда все еще может быть выполнена.

1

Добавление/удаление, как свойство get/set, но для событий.Код добавления будет вызываться, когда

RelayCommandInstance.CanExecuteChanged += MyChangedEventHandler 

Выполнено. Код remove вызывается при выполнении = =. Вы не видите этот синтаксис очень сильно, так как вам редко приходится переопределять поведение по умолчанию добавления/удаления делегата из списка вызовов событий.

В этом случае RelayCommand просто сопоставляет событие CanExecuteChanged с событием CommandManager.RequerySknown.