MVVM кнопка включения / выключения с конвертером

У меня есть 2 кнопки, которые я хочу отключить / включить на основе счетчика

вот мой счетчик

private int _stepCounter = 0;
        public int StepCounter
        {
            get { return _stepCounter; }
            set{_stepCounter=value; OnPropertyChanged("StepCounter");}
        }
        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

я написал следующий IValueConverter

 [ValueConversion(typeof(int), typeof(bool))]
    class inttobool : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture, string ButtonName)
        {
            int stepcount = (int)value;
            if (stepcount == 0 && ButtonName == "PreviousStepButton")
            {
                return false;
            }
            else if (stepcount == 5 && ButtonName == "NextStepButton")
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture, string Buttonname)
        {
            return null;
        }
    }

и мои пуговицы выглядят как следующие

<Button Name="NextStepButton" Content="Next Step" Click="NextStepButton_Click" />
<Button Name="PreviousStepButton" Content="PreviousStep"click="PreviousStepButton_Click" />

NextStepButton_Click событие увеличивает счетчик на одинPreviousStepButton_Click событие уменьшает счетчик на один

я пытаюсь узнать mvvm, и мой вопрос, как я могу отправить название кнопки, которую я нажал в конвертер?

как должен выглядеть оператор связывания в свойстве IsEnabled в XAML?

мне нужно отключить NextStepButton когда счетчик достигает 5 и мне нужно отключить PreviousStep когда счетчик достигает 0, в противном случае оба активируются.

2 ответа

Решение

я пытаюсь выучить mvvm

Подход MVVM предполагает, что вы должны использовать команды (любые ICommand реализации), когда вы хотите выполнить какое-либо действие в вашей модели представления и связать эти команды с кнопками:

<Button Content="Previous" Command="{Binding PreviousCommand}"/>
<Button Content="Next" Command="{Binding NextCommand}"/>

Обычно, ICommand реализации являются RelayCommand / DelegateCommand (погугли это). Эти реализации позволяют вам определить двух делегатов в вашей модели представления:

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

Кнопки WPF знакомы с ICommand Итак, если команда связана с кнопкой, кнопка вызывает CanExecute и если он вернется false кнопка становится отключенной.

Здесь нет необходимости в конвертере (и, конечно, для любого button_Click обработчики).
Вам даже не нужно никаких IsNextEnabled / IsPreviousEnabled свойства - обязательные и CanExecute сделай это для тебя.

Вот код для этого с использованием MVVM.

Посмотреть:

<Button Content="Next Step Button" IsEnabled="{Binding NextStepButtonEnabled}" Command="{Binding NextStepButtonCommand}" />
<Button Content="Previous Step Button" IsEnabled="{Binding PreviousStepButtonEnabled}" Command="{Binding PreviousStepButtonCommand}" />

ViewModel

// Binding Command.
private ICommand _nextStepButtonCommand;
public ICommand NextStepButtonCommand
{
    get { return _nextStepButtonCommand?? (_nextStepButtonCommand= new RelayCommand(NextStepButton);}
}

// Button Action
public void NextStepButton()
{
   _stepCounter++;
}

// Button enabled check,
public bool NextStepButtonEnabled { get { return _stepCounter == 5 ? false : true; } }

private ICommand _previousStepButtonCommand;
public ICommand PreviousStepButtonCommand
{
    get { return _previousStepButtonCommand?? (_previousStepButtonCommand= new RelayCommand(PerviousStepButton);}
}

public void PerviousStepButton()
{
   _stepCounter--;
}

public bool PreviousStepButtonEnabled { get { return _stepCounter == 0 ? false : true; } }
Другие вопросы по тегам