20

我可以使用 CanExecuteChanged 更改“可以执行”条件吗?

或者……它的用途是“什么”?

4

3 回答 3

26

不,您不能使用它来更改可执行状态。它是一个事件,参与该ICommand模式的对象可以选择侦听该事件,例如,按钮可以使用该事件知道何时重新查询命令状态(通过调用 can execute 方法)以设置其启用状态。

为了使 can execute 模式有用,需要有一些可以用来引发事件的东西。PrismDelegateCommand有一个方法,您可以调用该方法手动引发此事件,因此如果订阅者选择了该模式,他们将重新查询 can execute 方法。

  • 将命令分配给按钮。
  • 订阅的按钮可以执行更改的事件。
  • 按钮执行可以执行方法,它返回 false - 禁用按钮。
  • 您更改可以执行方法的状态取决于。
  • 您调用 raise 可以在 Prism 命令上执行更改。
  • 可以执行更改的事件被引发。
  • 按钮事件处理程序触发。
  • 按钮调用命令可以执行方法 - 按钮启用。

例子

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();
    }
}
于 2010-12-25T19:29:07.820 回答
9

或者只是打电话System.Windows.Input.CommandManager.InvalidateRequerySuggested(),以便CanExecute重新评估您的处理程序。

于 2011-05-26T16:20:44.913 回答
2
public override event EventHandler CanExecuteChanged
{    
    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }
}

我不知道这对性能有什么影响;但是,无论哪种方式,它们似乎都不太好。这就是我使用的。

于 2015-10-29T19:03:40.193 回答