我能否使用CanExecuteChanged来改变“可执行”条件?
另外,它用于什么目的?
我能否使用CanExecuteChanged来改变“可执行”条件?
另外,它用于什么目的?
ICommand
模式的对象可以选择监听此事件。例如,按钮可以使用此事件来确定何时重新查询命令状态(通过调用canExecute方法)以设置其启用状态。DelegateCommand
有一个方法,您可以调用该方法手动引发此事件,因此如果订阅者已选择进入模式,则会重新查询can execute方法。
示例
在以下基于Prism的示例中,我们在保存命令正在执行时将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();
}
}
或者直接调用System.Windows.Input.CommandManager.InvalidateRequerySuggested()
,以便重新评估您的CanExecute
处理程序。
public override event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
我不知道这样做对性能会有什么影响;但是无论如何,它们似乎都不会太大。这就是我使用的方法。