CanExecute и CanExecuteChanged, я должен реализовать их с RelayCommand?

Я использую MVVM-Light, и у меня есть моя команда реле работает отлично, я только что прочитал, что я должен реализовывать CanExecuteChanged и CanExecute. Хотя я не могу найти хороший пример.

у кого-нибудь есть хороший пример, как реализовать это.

CanExecute должен вернуть False, когда он не может быть выполнен, но не просто отменить кнопку ??

когда я выполняю CanExecuteChanged?

у кого-нибудь есть хорошие примеры, когда использовать каждый из них, мой код работает без но этот блог post заявляет, что я должен реализовать эти пункты.

Я немного смущен, так как я сказал, что думал, что просто свяжу Enabled свойство или что-то к свойству в ViewModel, чтобы я мог отключить кнопку или аналогичный элемент управления?

любая помощь в понимании была бы очень благодарна.

редактировать

это то, что у меня есть сейчас... Его работа, но кнопка физически не отключен, только commmand не запускается, поскольку я возвращаю false. Я вызываю CanExecuteMe в конструкторе, чтобы заставить RaiseCanExecuteChanged работать ...

это работает в моем construtor моей viewmodel

        this.Page2Command = new RelayCommand(() => this.GoToPage2(), () => CanExecuteMe);

        CanExecuteMe = false;

и вот остальная часть моего кода, я взял его из примера.

    private bool _canIncrement = true;

    public bool CanExecuteMe
    {
        get
        {
            return _canIncrement;
        }

        set
        {
            if (_canIncrement == value)
            {
                return;
            }

            _canIncrement = value;

            // Update bindings, no broadcast
            //RaisePropertyChanged(CanIncrementPropertyName);

            Page2Command.RaiseCanExecuteChanged();
        }
    }

    public RelayCommand Page2Command
    {
        get;
        private set;
    }

    private object GoToPage2()
    {
        System.Windows.MessageBox.Show("Navigate to Page 2!");
        return null;
    }

и вот мой XAML

  <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="31,77,0,0" x:Name="button1" VerticalAlignment="Top" Width="75" >
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                    <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding Page2Command, Mode=OneWay}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Button>

2 ответов


CanExecute вызывается, когда кнопка должна определить, должна ли она быть включена или нет.

кнопка делает это при привязке, и после каждого запуска CanExecuteChanged (кнопка слушает это событие для своей команды).

Итак, если кнопка должна быть отключена, вы должны запустить CanExecuteChanged и, когда кнопка вызывает CanExecute, вы должны вернуть false. Это предпочтительный метод включения / выключения кнопки при использовании команды фурнитура.

привязки команд позволяют инкапсулировать всю логику кнопок в экземпляре (команда). Метод CanExecute должен запросить текущее состояние приложения, чтобы определить, должна ли кнопка быть включена или отключена. С помощью этой инкапсуляции вы уменьшаете код спагетти в своей модели представления, где эти проверки выполняются здесь, там и там, и я забыл об этом там.


вы должны быть очень осторожны, используя предикат CanExecute. Он проверяет каждое изменение пользовательского интерфейса и для каждой клавиши клавиатуры, введенной в любое поле.

Это может вызвать проблемы с производительностью!