如何使用枚举属性触发属性更改?

时间:2018-04-11 13:08:50

标签: c# wpf xaml mvvm inotifypropertychanged

我有一个标准枚举,可以是是或否:

public enum YesOrNo
{
   Yes,
   No
}

我的基础Model Class有一个YesOrNo属性,如下所示:

public class Group : NotifyPropertyChanged
{
  private YesOrNo groupOperator;
  public YesOrNo GroupOperator
  {
    get
    {
      return this.groupOperator;
    }
    set
    {
      this.groupOperator = value;
      OnPropertyChanged("GroupOperator");
    }
  }

在我的视图中,我使用的是ToggleSwitch,类似于您在移动电话上看到的滑块。来回滑动应该有效地重新分配Enum的价值。因此它将默认为是并且滑动切换将Enum值设置为No,或者。

如果我有一个测试方法在命中Checked命令时重新分配Enum,则会触发PropertyChanged事件,所以我知道这在技术上有效。我只是想知道如何在Enum中交替使用值。

这是我的XAML中的ToggleButton:

<ToggleButton Style="{StaticResource ToggleViewSwitch}" Command="{Binding SetOperatorCommand, UpdateSourceTrigger=PropertyChanged}" IsChecked="{Binding IsChecked, UpdateSourceTrigger=PropertyChanged}"/>

这是我的主视图模型,我按住Command和测试方法手动分配值:

  private bool isChecked = false;
    public bool IsChecked
    {
        get
        {
            return this.isChecked;
        }
        set
        {
            this.isChecked = value;
            OnPropertyChanged("IsChecked");
        }
    }

 private RelayCommand setOperatorCommand;
    public ICommand SetOperatorCommand
    {
        get
        {
            if (this.setOperatorCommand == null)
            {
                this.setOperatorCommand = new RelayCommand(
                    x => ToggleGroupOperator());
            }
            return this.setOperatorCommand;
        }
    }

    private void ToggleGroupOperator()
    {
        if (IsChecked)
        {
            TopLevelGroup.GroupOperator = YesNo.No;
        }
        else
        {
            TopLevelGroup.GroupOperator = YesNo.Yes;
        }
    }

1 个答案:

答案 0 :(得分:0)

首先制作转换器......

public class YesOrNoToBooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        => (value is YesOrNo yesOrNo && yesOrNo == YesOrNo.Yes) ? true : false;

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        => (value is bool isYes && isYes) ? YesOrNo.Yes : YesOrNo.No;
}

然后在绑定期间引用转换器...

<Window.Resources>
    <Converters:YesOrNoToBooleanConverter x:Key="YesOrNoToBooleanConverter" />
</Window.Resources>

<Grid>
    <CheckBox IsChecked="{Binding GroupOperator, Converter={StaticResource YesOrNoToBooleanConverter}}" />
</Grid>

这将允许您的ViewModel继续使用枚举而不会产生任何开销,并且视图可以在没有任何开销的情况下进行绑定;将此绑定操作工作留给转换器。