【问题标题】:ICommand doesn't update the IsEnabled on a button using CanExecuteICommand 不使用 CanExecute 更新按钮上的 IsEnabled
【发布时间】:2014-06-26 15:51:57
【问题描述】:

我有一个非常简单的按钮绑定到一个命令

    <Button Content="Add" Margin="10,10,10,0" Command="{Binding SaveCommand}" ></Button>

我的命令代码

    public ICommand SaveCommand
    {
        get;
        internal set;
    }

    private bool CanExecuteSaveCommand()
    {
        return DateTime.Now.Second % 2 == 0;
    }

    private void CreateSaveCommand()
    {
        SaveCommand = new DelegateCommand(param => this.SaveExecute(), param => CanExecuteSaveCommand());
    }

    public void SaveExecute()
    {
        PharmacyItem newItem = new PharmacyItem();
        newItem.Name = ItemToAdd.Name;
        newItem.IsleNumber = ItemToAdd.IsleNumber;
        newItem.ExpDate = ItemToAdd.ExpDate;
        PI.Add(newItem);
    }

代码有效地阻止了基于 CanExecuteSaveCommand 运行的命令,但按钮永远不会被禁用,有没有办法实现这一点?

【问题讨论】:

  • 你能展示你的实现DelegateCommand吗?还是您使用的是 MVVM 框架?
  • public DelegateCommand(Action execute, Predicate canExecute) { _execute = execute; _canExecute = 可以执行; }

标签: wpf mvvm canexecute


【解决方案1】:

ICommand.CanExecute() 会在 WPF 认为命令可用性可能已更改时自动调用。这通常发生在用户活动上,例如键盘事件、焦点事件等。

由于您的命令可用性完全基于时间而变化,因此 WPF 无法猜测它是否已更改。相反,您需要通过调用CommandManager.InvalidateRequerySuggested(); 来给它一个提示

由于您的命令可用性每秒都在变化,因此您需要设置一个计时器以至少每秒调用一次此函数。

请注意,尽管InvalidateRequerySuggested() 是最简单的解决方案,但它会导致 WPF 重新评估所有命令的可用性。如果这是一个性能问题,您可以改为在您的 ICommand 实例上引发 CanExecuteChanged 事件。

【讨论】:

  • 如果在后台线程上执行此操作,您可能需要使用 Dispatcher 运行此操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 2016-06-13
  • 2013-10-28
  • 1970-01-01
  • 2015-12-10
相关资源
最近更新 更多