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; } }