c# - 当另一个切换为真时如何将切换更改为假
问题描述
当我尝试关闭一个开关并打开另一个开关的逻辑时,我得到了堆栈溢出。
我有 2 个开关。它们都在 VM 中侦听 2 个不同的属性(IsAddAppleEnabled
和IsAddOrangeEnabled
)。
我希望它什么时候IsAddAppledEnabled
是真的,什么时候IsAddOrangeEnabled
是假的……反之亦然。
我尝试在设置器中执行此操作,但最终进入循环并获得 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(布尔反转转换器):您可以在视图模型中使用单个属性并利用转换器,以便 xaml 可以根据状态做出不同的反应。
一个例子是简单地使用一个 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(枚举转换器):如果您最终获得额外的互斥状态,另一个可能效果更好的选项是使用 enum。
转换器
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;
}
}
视图模型:
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}}"/>
推荐阅读
- netlogo - 导入的补丁颜色在 NetLogo 中无法正常工作
- html - 如何在背景上方和边框后面的按钮的右上角添加一个圆圈?
- javascript - ESLint CLI(全局安装)--fix 不起作用
- macros - 使用“选择变量”命令保持原始变量顺序
- sql - 如何使用 sql cast 运算符将包含日期和时间的字符串列转换为日期?
- python-2.7 - 如何在字符串中添加整数,仅使用两个 while 循环,其中一个嵌套在另一个中
- maven - 将本地 maven 插件与远程存储库集成
- sql - 为什么向 mariadb 发送 ' 符号会导致它显示 '> 而不是 >
- ios - 使用相机会话捕获的裁剪图像
- vue.js - eslint vee 验证 no-unused-vars