【问题标题】:How to fire Property Changed with an Enum Property?如何使用枚举属性触发属性更改?
【发布时间】:2018-04-11 13:08:50
【问题描述】:

我有一个标准的枚举,要么是,要么是否:

public enum YesOrNo
{
   Yes,
   No
}

我的基础模型类有这样的 YesOrNo 属性:

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

在我看来,我使用的是 ToggleSwitch,类似于您在手机上看到的滑块。来回滑动应该有效地重新分配枚举的值。所以它会默认为 Yes,滑动切换开关会将 Enum 值设置为 No,或者。

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

这是我的 XAML 中的 ToggleButton:

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

这是我的主视图模型,我持有命令和测试方法来手动分配值:

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

【问题讨论】:

  • IsChecked 是为了知道按钮是否被切换。
  • 你有什么理由使用枚举而不是布尔值吗?
  • 如果你想直接绑定你可以使用 EnumToBooleanConverter?
  • 如果你真的想要一个枚举,你不需要转换器。你有一个视图模型。制作 YesOrNo 类型的支持字段并在 get/set 中进行翻译。或者如果您打算序列化并且您的计划是“是”或“否”作为字符串,则使用单独的字段 YesNo 将 true false 包装起来。
  • 切换按钮通常不需要命令。只需对其 IsChecked 属性进行双向绑定。另请注意,WPF ToggleButton 的 IsChecked 属性默认情况下已经绑定了 TwoWay,因此您已经准备好一切。只需在 IsChecked 属性设置器中更新 GroupOperator。

标签: c# wpf xaml mvvm inotifypropertychanged


【解决方案1】:

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

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 继续使用枚举而无需任何开销,并且无需任何开销即可绑定视图;将此绑定操作工作留给转换器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 2012-02-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    相关资源
    最近更新 更多