CanExecuteChanged是用来做什么的?

21

我能否使用CanExecuteChanged来改变“可执行”条件?

另外,它用于什么目的?

3个回答

27
不,你不能使用它来改变可执行状态。它是一个事件,参与ICommand模式的对象可以选择监听此事件。例如,按钮可以使用此事件来确定何时重新查询命令状态(通过调用canExecute方法)以设置其启用状态。
为了使can execute模式有用,需要有一些东西可以用来引发事件。Prism的DelegateCommand有一个方法,您可以调用该方法手动引发此事件,因此如果订阅者已选择进入模式,则会重新查询can execute方法。
  • 将命令分配给按钮。
  • 按钮订阅can execute changed事件。
  • 按钮执行can execute方法,并返回false - 禁用按钮。
  • 更改can execute方法依赖的状态。
  • 调用Prism命令上的raise can execute changed。
  • can execute changed事件被触发。
  • 按钮事件处理程序触发。
  • 按钮调用命令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();
    }
}

我是否有办法动态重新定义我的CanExecute条件? - Relativity
@Anish 是的,你的 CanExecute 方法的想法是要引用一些状态(例如一个布尔值)。你可以随意更改它,但在更改后,你必须调用你的框架的方法来引发可执行更改事件,例如 Prism 命令的 RaiseCanExecuteChanged。所有监听该事件的元素都将调用 CanExecute 方法并继续使用返回的值。 - Tim Lloyd
"你可以随意更改这个," => 我该如何更改它...我需要编辑而不是新建一个。 - Relativity
@Anish 你不能更改can execute方法,但是你可以更改它所引用的变量。我会尝试给你提供代码示例,但是我现在正在使用手机 - 这太痛苦了! - Tim Lloyd

9

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


好的,谢谢。你知道这种方法是否会影响性能(例如在用户界面中频繁使用命令时)? - Luke
这不是我遇到的问题,我想这取决于处理程序的数量和复杂性以及系统的总体性能。 - Jodrell

2
public override event EventHandler CanExecuteChanged
{    
    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }
}

我不知道这样做对性能会有什么影响;但是无论如何,它们似乎都不会太大。这就是我使用的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接