Нужна помощь в понимании MVVM Tutorial, RelayCommand & Use lambdas - PullRequest
3 голосов
/ 22 августа 2010

Я читаю приложения Джоша Смита с шаблоном проектирования Model-View-ViewModel учебник

Я не понимаю, что пытается сделать приведенный ниже код.
Во-первых, синтаксис напоминает мне свойства, но с добавлением / удалением.

Но что такое CommandManager.RequerySuggested?

делегирует подписку на событие CommandManager.RequerySuggested событие. Это гарантирует, что WPF командная инфраструктура просит всех Объекты RelayCommand, если они могут выполнять всякий раз, когда он просит встроенный команды

//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 }

Кроме того, команда сохранения настраивается с помощью лямбды. Во-первых, есть 2 переменные параметра. Будут ли они конфликтовать? я не могу просто сделать что-то вроде RelayCommand(this.Save(), this.CanSave) или такой синтаксис отсутствует.

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

1 Ответ

3 голосов
/ 22 августа 2010
  1. CommandManager.RequerySuggested += value означает, что если функция для CanExecute может разрешать значения true и false в зависимости от некоторых условий.

    WPF отключит Button/MenuItem (CommandButtonBase), если оно оценивается как false, и включится, когда условие оценивается как true.
    Если у вас нет этих двух строк, WPFбудет запрашивать команду только один раз (когда загружен Button / MenuItem и не будет обновляться после этого, пока вы не сделаете это вручную.

  2. Два параметра (лямбда-выражения) имеют тип Action<object> и Predicate<object> соответственно. Таким образом, они по определению не могут конфликтовать (params - это просто имя - и поскольку две функции имеют разную область видимости - они не конфликтуют).

    Если у вас есть метод с правильной подписью, вы можете использовать его в конструкторе

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

    соответственно, но у вас не должно быть () в конце - поэтому новый RelayCommand(this.Save,this.CanSave) должен работать.

...