我可以使用CanExecuteChanged更改“可执行”条件吗?
或者......“为什么”使用它?
答案 0 :(得分:22)
不,你不能用它来改变可执行状态。这是一个事件,参与ICommand
模式的对象可以选择收听此事件,例如按钮可以使用此事件来知道何时重新查询命令状态(通过调用can execute方法)来设置其启用状态。
为了使can执行模式有用,需要有一些东西可以用来引发事件。 Prism的DelegateCommand
有一个方法可以调用手动引发此事件,以便订阅者在选择加入模式后重新查询can execute方法。
示例强>
在以下基于Prism的示例中,我们在执行save命令时将SaveCommand CanExecute
的状态从false更改为true。对RaiseCanExecuteChanged
的调用将导致CanExecuteChanged
事件被引发,客户端将调用CanExecute
方法。在实践中,这将使绑定到SaveCommand
的“保存”按钮将其状态从启用更改为禁用,然后再次返回到启用状态。
public class BlingViewModel
{
private DelegateCommand<object> _saveCommand;
private bool _canSaveExecute = true;
public ICommand SaveCommand
{
get
{
if (_saveCommand == null)
{
_saveCommand = new DelegateCommand<object>
(
executeMethod: _ => Save()
,
canExecuteMethod: _ => _canSaveExecute
);
}
return _saveCommand;
}
}
private void Save()
{
_canSaveExecute = false;
_saveCommand.RaiseCanExecuteChanged();
Console.WriteLine("Saving...");
_canSaveExecute = true;
_saveCommand.RaiseCanExecuteChanged();
}
}
答案 1 :(得分:7)
或者只需致电System.Windows.Input.CommandManager.InvalidateRequerySuggested()
,以便重新评估您的CanExecute
处理程序。
答案 2 :(得分:2)
public override event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
我不知道这对性能有何影响;然而,无论如何,它们似乎都不太好。这就是我使用的。