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); }
}