Отключение кнопки MVVM

Я использую SIlverLight RelayCommand для включения и отключения кнопок. Исходя из некоторого условия, я хочу отключить кнопку, Пожалуйста, предложите, как я могу отключить кнопку

Ниже работает нормально для начальной нагрузки,

 public RelayCommand BackClickCommand
    {
        get
        {
            if (_backClickCommand == null)
            {
                _backClickCommand = new RelayCommand(() =>
                {
                    step--;
                    if(step<1)
                  //code need to diable this button
                },() => this.CanExecute());
            }

            return _backClickCommand;

        }
    }
    int step=2;

    public bool CanExecute()
    {
        if(step>0)
        return enabled;
        else false;
    }

Некоторые, где в моем коде я делаю

    enabled = false;

Пожалуйста, предложите, как я могу отключить свою кнопку

Благодаря,

0
nl ja de
Привет user1814841, если вы нашли ответ, чтобы исправить свою проблему, отметьте его как таковой. Если нет, и вы сами ее исправили, вы можете ответить на свой вопрос. Для получения дополнительной информации см. Faq: stackoverflow.com/faq
добавлено автор Peter, источник

4 ответы

Предполагая, что вы привязываете свой Xaml следующим образом:

<button Command="{Binding BackClickCommand}" />

Все, что вам нужно сделать, это напомнить интерфейс, чтобы снова проверить привязку:

enabled = false;
PropertyChanged(this, new PropertyChangedEventArgs("BackClickCommand"));

Это приведет к тому, что пользовательский интерфейс снова проверит BackClickCommand и увидит, что он изменен, тем самым отключив кнопку.

См. MSDN для пример полного кода.

Изменить: это будет возможный фрагмент кода:

int step = 2;

public RelayCommand BackClickCommand
{
    get
    {
        if (_backClickCommand == null)
        {
            _backClickCommand = new RelayCommand(() =>
            {
                step--;
                PropertyChanged(this, new PropertyChangedEventArgs("BackClickCommand")); 
            },() => this.CanExecute());
        }

        return _backClickCommand;

    }
}

public bool CanExecute()
{
    return this.step > 0;
}
2
добавлено
извините за путаницу, добавленную еще больше, код, который я хочу отключить, на основе целочисленного значения Step. Пожалуйста, подождите
добавлено автор user1814841, источник

Предполагая, что вы привязываете свой Xaml следующим образом:

<button Command="{Binding BackClickCommand}" />

Все, что вам нужно сделать, это напомнить интерфейс, чтобы снова проверить привязку:

enabled = false;
PropertyChanged(this, new PropertyChangedEventArgs("BackClickCommand"));

Это приведет к тому, что пользовательский интерфейс снова проверит BackClickCommand и увидит, что он изменен, тем самым отключив кнопку.

См. MSDN для пример полного кода.

Изменить: это будет возможный фрагмент кода:

int step = 2;

public RelayCommand BackClickCommand
{
    get
    {
        if (_backClickCommand == null)
        {
            _backClickCommand = new RelayCommand(() =>
            {
                step--;
                PropertyChanged(this, new PropertyChangedEventArgs("BackClickCommand")); 
            },() => this.CanExecute());
        }

        return _backClickCommand;

    }
}

public bool CanExecute()
{
    return this.step > 0;
}
2
добавлено
извините за путаницу, добавленную еще больше, код, который я хочу отключить, на основе целочисленного значения Step. Пожалуйста, подождите
добавлено автор user1814841, источник

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

Как вы сказали, включено будет оцениваться где-то в коде.

Ваш код может быть не таким же:

int step=2;

public RelayCommand BackClickCommand
{
    get
    {
        if (_backClickCommand == null)
        {
            _backClickCommand = new RelayCommand(() =>
            {
                step--;//Your logic
                OnPropertyChanged("BackClickCommand");//Notify the change!
            },() => this.CanExecute());
        }

        return _backClickCommand;
    }
}

public bool CanExecute()
{
    return enabled;
}
0
добавлено
Извините, я никогда не работал с Galasoft.
добавлено автор JoanComasFdz, источник
@ user1814841 Если его работа, пожалуйста, отметьте этот ответ как правильный.
добавлено автор JoanComasFdz, источник
Я использую Galasoft RaisePropertyChanged, он не стреляет. Любая проблема с RaisePropertyChanged?
добавлено автор user1814841, источник
Работает отлично с .RaiseCanExecuteChanged ();
добавлено автор user1814841, источник

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

Как вы сказали, включено будет оцениваться где-то в коде.

Ваш код может быть не таким же:

int step=2;

public RelayCommand BackClickCommand
{
    get
    {
        if (_backClickCommand == null)
        {
            _backClickCommand = new RelayCommand(() =>
            {
                step--;//Your logic
                OnPropertyChanged("BackClickCommand");//Notify the change!
            },() => this.CanExecute());
        }

        return _backClickCommand;
    }
}

public bool CanExecute()
{
    return enabled;
}
0
добавлено
Извините, я никогда не работал с Galasoft.
добавлено автор JoanComasFdz, источник
@ user1814841 Если его работа, пожалуйста, отметьте этот ответ как правильный.
добавлено автор JoanComasFdz, источник
Я использую Galasoft RaisePropertyChanged, он не стреляет. Любая проблема с RaisePropertyChanged?
добавлено автор user1814841, источник
Работает отлично с .RaiseCanExecuteChanged ();
добавлено автор user1814841, источник