【问题标题】:What is CanExecuteChanged for?CanExecuteChanged 有什么用?
【发布时间】:2011-05-30 16:52:24
【问题描述】:

我可以使用 CanExecuteChanged 来改变“可以执行”的条件吗?

否则……它是用来“做什么”的?

【问题讨论】:

    标签: wpf mvvm canexecute


    【解决方案1】:

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

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

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

    示例

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

    【讨论】:

    • 无论如何我可以动态地重新定义我的 CanExecute 条件吗?
    • @Anish 是的,这个想法是让您的 CanExecute 方法引用某些状态(例如布尔值)。您可以随意更改它,但在更改之后,您必须调用框架的方法来引发可以执行更改的事件,例如RaiseCanExecuteChanged 用于 Prism 命令。然后所有监听事件的元素都会调用 CanExecute 方法并继续处理返回的值。
    • "这个你可以随意改," => 怎么改...我需要修改的不是新的。
    • @Anish 你不能改变 can execute 方法,但是你可以改变它所引用的变量。我会试着给你一个代码示例,但我在我的手机上——这很痛苦!
    【解决方案2】:

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

    【讨论】:

    • 好点,谢谢。您知道这种方法是否会影响性能(有形影响,例如 UI 中命令的中/重度使用)?
    • 这不是我遇到的问题,我想这取决于处理程序的数量和复杂性以及系统的总体性能。
    【解决方案3】:
    public override event EventHandler CanExecuteChanged
    {    
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }
    

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

    【讨论】:

      猜你喜欢
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多