4

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

    <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 运行的命令,但该按钮永远不会被禁用,有没有办法实现这一点?

4

1 回答 1

13

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

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

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

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

于 2014-05-09T08:16:29.893 回答