c# - 中继命令上的 CanExecute 不起作用

标签 c# .net wpf mvvm relaycommand

我有一个带有按钮的简单程序,该按钮绑定(bind)到 View 模型中的 Relaycommand,如下所示。我根据某个值将 CanExecute 设置为 true(由计时器设置,您可以在下面找到详细信息)。当 Status 为时,我的按钮已启用3,最初我在构造函数中设置它。但是当状态值自己更改时它不会被禁用。我可以看到只有当我点击它时才会禁用。任何人都可以解释为什么它不会自行禁用

public class MainWindowViewModel : INotifyPropertyChanged
{

    private RelayCommand mClickButtonCommand;
    private int mStatus;
    private Timer mTimer;


    public MainWindowViewModel()
    {
        Status = 3;

        mTimer = new Timer(1000);
        mTimer.Elapsed += OnElapsed;
        mTimer.Start();
    }

    private void OnElapsed(object sender, ElapsedEventArgs e)
    {
        if (Status == 5)
        {
            Status = 0;
        }
        Status++;
    }

    public ICommand ClickButtonCommand
    {
        get
        {
            if (mClickButtonCommand == null)
            {
                mClickButtonCommand = new RelayCommand(OnClick, () => CanClick);
            }
            return mClickButtonCommand;
        }
    }

    private void OnClick()
    {
        Console.WriteLine("Clicked");
    }

    public bool CanClick
    {
        get { return Status == 3; }
    }

    public int Status
    {
        get { return mStatus; }
        set
        {
            mStatus = value;
            OnPropertyChanged("Status");
            OnPropertyChanged("CanClick");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

我真正的命令实现是
 public class RelayCommand : ICommand
{



    public RelayCommand(Action execute)
        : this(execute, null)
    {
    }
    public RelayCommand(Action execute, Func<bool> canExecute)
    {
        if (execute == null)
            throw new ArgumentNullException("execute");

        _execute = execute;
        _canExecute = canExecute;
    }

    #region ICommand Members

    [DebuggerStepThrough]
    public bool CanExecute(object parameter)
    {
        return _canExecute == null ? true : _canExecute();
    }

    public event EventHandler CanExecuteChanged
    {
        add
        {
            if (_canExecute != null)
                CommandManager.RequerySuggested += value;
        }
        remove
        {
            if (_canExecute != null)
                CommandManager.RequerySuggested -= value;
        }
    }

    public void Execute(object parameter)
    {
        _execute();
    }

    #endregion // ICommand Members

    #region Fields

    readonly Action _execute;
    readonly Func<bool> _canExecute;

    #endregion // Fields
}

最佳答案

感谢您的输入,我通过在我的中继命令实现中添加 CommandManager.InvalidateRequerySuggested 解决了我的问题。

[DebuggerStepThrough]
    public bool CanExecute(object parameter)
    {
        bool result = true;

        if (_canExecute != null)
        {
            result = _canExecute();
            CommandManager.InvalidateRequerySuggested();
        }
        return result;
    }

关于c# - 中继命令上的 CanExecute 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24119185/

相关文章:

c# - 文件编码未知时如何使用ReadAllText

c# - VirtualKey C# Windows 应用商店应用程序

c# - 为什么静态 Configuration.GetSection() 不可用?

c# - 如何在 WinForm 上绘制 eclipse 刻的 3D 线?

c# - Amazon S3,同步,修改日期与上传日期

c# - 在线crm动态,将自定义url参数传递给插件

c# - 通过 API 测试测量 C# .net 代码覆盖率

c# - 是否可以更改 Extended WPF Toolkit 的 Busyindicator 中的忙碌动画?

wpf - 数据模板中的设计时数据上下文?

用于拖放操作的 IsMouseOver 上的 WPF 触发器