Событие RaiseCanExecuteChanged - PullRequest
0 голосов
/ 18 мая 2011

Я нахожусь на стадии проекта, где мне нужно получить контроль над включением / отключением некоторых гиперссылок на основе различных бизнес-правил. Я заметил, что все темы о событии RaiseCanExecuteChanged относятся к свету MVVM. Означает ли это, что я должен использовать MVVM light или есть способ получить доступ к этому событию, используя стандартный MVVM. Если так, то как? Спасибо

1 Ответ

2 голосов
/ 18 мая 2011

ICommands имеют событие , на которое подписываются наблюдатели команд.Когда это событие срабатывает, наблюдатели (кнопка и т. Д.) Обязаны вызвать CanExecute , чтобы определить, должны ли они сами включать / отключать.

Поскольку вы должны реализовать ICommandвы также должны предоставить вашим ViewModels (или что-то еще, в зависимости от вашего дизайна) способ вызвать это событие извне экземпляра ICommand.Как вы поступите об этом, зависит от вас.Обычно (по моему опыту) в вашей реализации ICommand есть метод, называемый чем-то вроде FireCanExecuteChanged, который вы можете вызвать, чтобы сообщить экземпляру, что они должны запустить событие CanExecute.в неопределенно c # -подобном псевдокоде.

public sealed class MyViewModel
{
  // dependencyproperty definition left off for brevity

  public MyCommand ACommand {get;private set;}

  // fired when some DP changes which affects if ACommand can fire    
  private static void OnSomeDependencyPropertyChanged
      (object sender, EventArgs e)
  {
    (sender as MyViewModel).ACommand.FireCanExecuteChanged();
  }
}

public sealed class MyCommand : ICommand
{
  public event EventHandler CanExecuteChanged;
  public bool CanExecute(object arg) { return arg != null; }
  public void Execute(object arg) { throw new NotImplementedException(); }
  public void FireCanExecuteChanged() { 
                  CanExecuteChanged(this, EventArgs.Empty); }
}
...