什么是CanExecuteChanged?

时间:2010-12-25 19:24:32

标签: wpf mvvm canexecute

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

或者......“为什么”使用它?

3 个答案:

答案 0 :(得分:22)

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

为了使can执行模式有用,需要有一些东西可以用来引发事件。 Prism的DelegateCommand有一个方法可以调用手动引发此事件,以便订阅者在选择加入模式后重新查询can execute方法。

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

示例

在以下基于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; }
}

我不知道这对性能有何影响;然而,无论如何,它们似乎都不太好。这就是我使用的。