CanExecute на Relay Command не работает

1

У меня есть простая программа с кнопкой, которая привязана к Relaycommand в модели View, как показано ниже. Я устанавливаю 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
}
  • 1
    почему он не отключается сам по себе - вы спрашиваете, почему сама кнопка не отключается?
  • 0
    да, я имел в виду, почему кнопка не становится серой, когда canexecute становится ложным.
Теги:
wpf
mvvm
relaycommand

2 ответа

0
Лучший ответ

Спасибо за ваши материалы, я решил свою проблему, добавив CommandManager.InvalidateRequerySposed в моей реализации relaycommand.

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

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

Точно так же, как вы поднимаете события PropertyChanged, вы можете создавать события ClickButtonCommand.RaiseCanExecuteChanged();... ClickButtonCommand.RaiseCanExecuteChanged();

  • 0
    Я не нашел RaiseCanExecuteChanged в интерфейсе ICommand, но я попробовал это StopScanCommand.CanExecuteChanged (); но выдает ошибку. Событие 'System.Windows.Input.ICommand.CanExecuteChanged' может появляться только в левой части + = или - =
  • 0
    Извините, я пропустил, что ClickButtonCommand определен только как интерфейс, тогда как mClickButtonCommand - это ваш реальный RelayCommand. Попробуйте mClickButtonCommand.RaiseCanExecuteChanged();
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню