Попытка обновить CanExecute для моих команд - PullRequest
0 голосов
/ 01 февраля 2019

Я создал модель базового представления, которая реализует ICommand.Команды просто отлично связываются, выполняются, как ожидается, и даже начинаются в правильных состояниях, но как свойства, которые влияют на то, может ли команда выполняться или нет, CanExecute для этих команд, похоже, не обновляется.

В приведенном ниже коде я могу нажать кнопку «Выполнить», и все работает как положено, КРОМЕ того, что при изменении ProgramStatus на «Выполнение» его следует отключить.

В моей модели базового вида:

public class RelayCommand : ICommand
    {

        #region ICommand Member Variables

        private Action<object> _execute;
        private Predicate<object> _canExecute;
        private event EventHandler _canExecuteChangedInternal;

        #endregion // ICommand Member Variables

        #region Constructors

        public RelayCommand(Action<object> execute, Predicate<object> canExecute)
        {
            _execute = execute;
            _canExecute = canExecute;
        }

        public RelayCommand(Action<object> execute) : this(execute, DefaultCanExecute)
        {

        }

        #endregion // Constructors

        #region ICommand Members

        public event EventHandler CanExecuteChanged
        {
            add
            {
                CommandManager.RequerySuggested += value;
                _canExecuteChangedInternal += value;
            }

            remove
            {
                CommandManager.RequerySuggested -= value;
                _canExecuteChangedInternal -= value;
            }
        }

        public bool CanExecute(object parameter)
        {
            return _canExecute != null && _canExecute(parameter);
        }

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

        public void OnCanExecuteChanged()
        {
            EventHandler eventHandler = _canExecuteChangedInternal;

            if (eventHandler != null)
            {
                eventHandler.Invoke(this, EventArgs.Empty);
            }
        }

        private static bool DefaultCanExecute(object parameter)
        {
            return true;
        }

        #endregion // ICommand Members

На мой взгляд модель:

RelayCommand _runCommand;
    public RelayCommand RunCommand
    {
        get
        {
            if (_runCommand == null)
            {
                _runCommand = new RelayCommand(param => Run(), param => CanRun);
            }

            return _runCommand;
        }
    }

public bool CanRun
    {
        get
        {
            bool result = false;

            if (Machine.ProgramStatus != ProgramStatus.Running && Machine.ProgramStatus != ProgramStatus.TestRunning)
            {
                result = true;
            }

            return result;
        }
    }

На мой взгляд:

<Button Content="Run" Command="{Binding Path=RunCommand}" />

1 Ответ

0 голосов
/ 01 февраля 2019

Вы должны вызвать CanExecuteChanged EventHandler.Поэтому, когда ProgramStatus изменяется на Running, вы можете вызвать вспомогательный метод OnCanExecuteChanged для команды, которую вы хотите обновить (например, RunCommand.OnCanExecuteChanged();).

Если CanExecute привязан к свойству, вы можете использовать вспомогательный метод OnCanExecuteChanged вустановщик свойства.

 private bool _myProperty;
 public bool MyProperty
    {
        get { return _myProperty; }
        set
        {
            _myProperty= value;
            RunCommand.OnCanExecuteChanged();
        }
    }
...