我可以使用 CanExecuteChanged 更改“可以执行”条件吗?
或者……它的用途是“什么”?
不,您不能使用它来更改可执行状态。它是一个事件,参与该ICommand
模式的对象可以选择侦听该事件,例如,按钮可以使用该事件知道何时重新查询命令状态(通过调用 can execute 方法)以设置其启用状态。
为了使 can execute 模式有用,需要有一些可以用来引发事件的东西。PrismDelegateCommand
有一个方法,您可以调用该方法手动引发此事件,因此如果订阅者选择了该模式,他们将重新查询 can execute 方法。
例子
CanExecute
在以下基于 Prism 的示例中,我们在执行保存命令时将SaveCommand 的状态从 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();
}
}
或者只是打电话System.Windows.Input.CommandManager.InvalidateRequerySuggested()
,以便CanExecute
重新评估您的处理程序。
public override event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
我不知道这对性能有什么影响;但是,无论哪种方式,它们似乎都不太好。这就是我使用的。