CanExecute и CanExecuteChanged, я должен реализовать их с помощью RelayCommand? - PullRequest
7 голосов
/ 03 мая 2011

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

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

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

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

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

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

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

РЕДАКТИРОВАТЬ

Это то, что у меня сейчас ...Работает, но кнопка физически НЕ ОТКЛЮЧЕНА, только команда не запускается, так как я возвращаю false.Я вызываю CanExecuteMe в конструкторе, чтобы принудительно запустить RaiseCanExecuteChanged ...

Это выполняется в моем конструкторе моей модели представления

        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 ]

10 голосов
/ 03 мая 2011

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

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

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

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

1 голос
/ 27 июня 2013

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

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

...