【发布时间】:2011-05-30 16:52:24
【问题描述】:
我可以使用 CanExecuteChanged 来改变“可以执行”的条件吗?
否则……它是用来“做什么”的?
【问题讨论】:
标签: wpf mvvm canexecute
我可以使用 CanExecuteChanged 来改变“可以执行”的条件吗?
否则……它是用来“做什么”的?
【问题讨论】:
标签: wpf mvvm canexecute
不,你不能用它来改变可以执行的状态。这是一个事件,参与ICommand 模式的对象可以选择收听此事件,例如按钮可以使用此事件来知道何时重新查询命令状态(通过调用 can execute 方法)以设置其启用状态。
为了使 can execute 模式有用,需要有一些东西可以用来引发事件。 Prism 的 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; }
}
我不知道这对性能有何影响;但是,无论哪种方式,它们似乎都不太好。这就是我使用的。
【讨论】: