1

我有 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,我的问题是如何将我单击的按钮的名称发送到转换器?

XAML 中 IsEnabled 属性中的绑定语句应该是什么样的?

我需要NextStepButton在计数器变为 5 时禁用,PreviousStep当计数器变为 0 时我需要禁用,否则两者都启用。

4

2 回答 2

3

我正在尝试学习 mvvm

MVVM 方法假定,ICommand当您想在视图模型中执行任何操作时,您应该使用命令(任何实现),并将这些命令绑定到按钮:

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

通常,ICommand实现是RelayCommand/ DelegateCommand(google it)。这些实现允许您在视图模型中定义两个委托:

  • 第一个是命令有效负载,即动作本身。
  • 第二个是检查执行该操作的能力。

WPF按钮对按钮很熟悉ICommand,所以,如果命令绑定到按钮,按钮调用CanExecute,如果返回false,按钮就会被禁用。

这里不需要转换器(当然也不需要任何button_Click处理程序)。
您甚至不需要任何IsNextEnabled/IsPreviousEnabled属性 - 绑定并CanExecute为您执行此操作。

于 2013-08-22T05:39:54.203 回答
1

这是使用 MVVM 执行此操作的代码。

看法:

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

视图模型

// 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; } }
于 2013-08-22T05:37:13.193 回答