c# - 如何在另一个切换为真时将切换更改为假

标签 c# wpf xaml

当我尝试关闭一个开关并打开另一个开关的逻辑时,我遇到了计算器溢出问题。

我有 2 个开关。它们都监听 VM 中的 2 个不同属性(IsAddAppleEnabledIsAddOrangeEnabled)。

我想要这样当 IsAddAppledEnabled 为真时,IsAddOrangeEnabled 为假......反之亦然。

我尝试在 setter 中执行此操作,但我最终陷入循环并获得 stackoverflow 异常

    private bool isAddAppledEnabled= false;
    public bool isAddAppledEnabled
    {
        get { return isAddReplicateToggleChecked; }
        set
        {
            isAddAppledEnabled= value;
            isAddOrangeEnabled= !value;
            OnPropertyChanged(nameof(IsAddAppledEnabled));
        }
    }

    private bool isAddOrangeEnabled= false;
    public bool IsAddOrangeEnabled
    {
        get { return isAddOrangeEnabled; }
        set
        {
            isAddOrangeEnabled= value;
            isAddAppledEnabled= !value;
            OnPropertyChanged(nameof(IsAddOrangeEnabled));
        }
    }

最佳答案

选项 A(最小方法更改):

private bool _isAddAppledEnabled = false;
public bool IsAddAppledEnabled
{
  get { return _isAddAppledEnabled; }
  set
  {
    if (_isAddAppledEnabled == value)
      return;

    _isAddAppledEnabled = value;
    IsAddOrangeEnabled = !value;
    OnPropertyChanged(nameof(IsAddAppledEnabled));
  }
}

private bool _isAddOrangeEnabled = false;
public bool IsAddOrangeEnabled
{
  get { return _isAddOrangeEnabled; }
  set
  {
    if (_isAddOrangeEnabled == value)
      return;

    _isAddOrangeEnabled = value;
    IsAddAppledEnabled = !value;
    OnPropertyChanged(nameof(IsAddOrangeEnabled));
  }
}

选项 B( bool 反转转换器): 您可以在 View 模型中使用单个属性并利用转换器,以便 xaml 可以根据状态做出不同的 react 。

一个例子是简单地使用一个 bool 值(就像你一样)并应用一个反转转换器:

  public class InvertedBooleanConverter : MarkupExtension, IValueConverter
  {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {

      if (value == null || (bool)value == false)
        return true;
      else
        return false;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
      if (value == null || (bool)value == false)
        return true;
      else
        return false;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
      return this;
    }
  }

用法:

  <Button IsEnabled="{Binding IsAddAppledEnabled}">
  <Button IsEnabled="{Binding IsAddAppledEnabled, Converter={yourNamespace:InvertedBooleanConverter}}">

选项 C(枚举转换器): 如果您最终得到一个额外的互斥状态,另一种可能更好的选择是使用枚举

转换器

  public class EnumToBooleanConverter : MarkupExtension, IValueConverter
  {
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
      return value.Equals(parameter);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
      return value.Equals(true) ? parameter : Binding.DoNothing;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
      return this;
    }
  }

View 模型:

public enum Fruits { Apple, Orange, Pear, Grape }

private Fruits _selectedFruit;
public Fruits SelectedFruit
{
  get { return _selectedFruit; }
  set
  {
    _selectedFruit = value;
    OnPropertyChanged(nameof(SelectedFruit));
  }
}

Xaml 用法:

<RadioButton Content="Apple" IsChecked="{Binding Path=SelectedFruit, Mode=TwoWay, Converter={yourNamespace:EnumToBooleanConverter}, ConverterParameter={x:Static yourNamespace:Fruits.Apple}}"/>
<RadioButton Content="Orange" IsChecked="{Binding Path=SelectedFruit, Mode=TwoWay, Converter={yourNamespace:EnumToBooleanConverter}, ConverterParameter={x:Static yourNamespace:Fruits.Orange}}"/>
<RadioButton Content="Pear" IsChecked="{Binding Path=SelectedFruit, Mode=TwoWay, Converter={yourNamespace:EnumToBooleanConverter}, ConverterParameter={x:Static yourNamespace:Fruits.Pear}}"/>
<RadioButton Content="Grape" IsChecked="{Binding Path=SelectedFruit, Mode=TwoWay, Converter={yourNamespace:EnumToBooleanConverter}, ConverterParameter={x:Static yourNamespace:Fruits.Grape}}"/>

关于c# - 如何在另一个切换为真时将切换更改为假,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57991950/

相关文章:

c# - Combobox datagridview选择更改了datagridview其他单元格中的填充值

c# - C# 中没有智能感知

c# - WPF 工具包数据列可见性绑定(bind)

wpf - 设置 ListView 以填充所有可用的垂直空间

c# - 无需外部工具即可打印 PDF

c# - Caliburn Micro Conductor.Collection.AllActive 不工作

c# - 获取选择的 Item 的父 ObservableCollection - WP8

.net - 在MVVM中,每个 View 模型只能有一个 View 吗?

c# - C#中如何自定义Resharper的 "code clean up"改变文档头规则

c# - 如何在 WPF 中操作另一个类的窗口对象