понедельник, 1 ноября 2010 г.

Реализация интерфейса ICommand для повторного использования

Если вы используете MVVM (model-view-viewmodel) паттерн, наиболее часто используемым механизмом является связывание действий в представлении командами. Для представления команды необходимо реализовать интерфейс ICommand. Это достаточно просто, однако это потребуется делать снова и снова.

Идея паттерна – создание универсальной команды, которая принимает два делегата: первый вызывается когда ICommand.Execute (object param) вызван, второй проверяет состояние, можно ли выполнить команду (ICommand.CanExecute(object param)).

Необходим также метод, переключающий событие CanExecuteChanged. Он вызывается элементами пользовательского интерфейса для переключения состояния CanExecute() команды.

Реализация:

  1. public class DelegateCommand : ICommand
  2. {
  3.     private readonly Predicate<object> _canExecute;
  4.     private readonly Action<object> _execute;
  5.     public event EventHandler CanExecuteChanged;
  6.     public DelegateCommand(Action<object> execute)
  7.                   : this(execute, null)
  8.     {
  9.     }
  10.     public DelegateCommand(Action<object> execute,
  11.                   Predicate<object> canExecute)
  12.     {
  13.         _execute = execute;
  14.         _canExecute = canExecute;
  15.     }
  16.     public override bool CanExecute(object parameter)
  17.     {
  18.         if (_canExecute == null)
  19.         {
  20.             return true;
  21.         }
  22.         return _canExecute(parameter);
  23.     }
  24.     public override void Execute(object parameter)
  25.     {
  26.         _execute(parameter);
  27.     }
  28.     public void RaiseCanExecuteChanged()
  29.     {
  30.         if( CanExecuteChanged != null )
  31.         {
  32.             CanExecuteChanged(this, EventArgs.Empty);
  33.         }
  34.     }
  35. }

Источник>>

Комментариев нет:

Отправить комментарий