我正在处理的项目定义了枚举,只有两个状态。我正在使用切换按钮来切换属性值。
使用我编写的用于将枚举绑定到一组单选按钮的值转换器不起作用,因为它仅因Binding.DoNothing
而改变了一个值。
这是用于单选按钮的布尔转换器的枚举,它只在一个方向上改变值:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value.Equals(parameter);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value.Equals(true) ? parameter : Binding.DoNothing;
}
作为一种解决方法,我通过在Binding.DoNothing
方法中将MyEnum.Off
替换为ConvertBack
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value.Equals(parameter);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value.Equals(true) ? parameter : MyEnum.Off;
}
是否有更好的方法来切换返回的枚举值,以启用切换按钮,将枚举切换为可在不同枚举类型之间重复使用的关闭状态?
答案 0 :(得分:2)
最简单的没有任何类型/ null / etc检查如下:
public object Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
return System.Convert.ToBoolean(value);
}
public object ConvertBack(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
return Enum.ToObject(targetType, value);
}
System.Convert.ToBoolean
接受任何值类型而不会抛出异常。
您也可以进行一些其他类型检查,例如if (targetType.IsEnum)
,但这取决于您。
根据msdn:Enum.ToObject()
只接受SByte, Int16, Int32, Int64, Byte, UInt16, UInt32, or UInt64.
,但我怀疑它在内部使用System.Convert
,因此也接受布尔值。
答案 1 :(得分:0)
如果你的enum只有2个状态,那么使用bool会不会更简单?然后,您可以将其外部化为一个函数,该函数根据当前值将bool切换为true / false
编辑:
在阅读@Kevin留下的评论后,我意识到我误解了原来的问题。希望下面的内容更符合您的要求。它将采用枚举T并迭代它,返回序列中每个下一项的int
索引,直到它到达结尾,在那里它将再次返回第一项(0)。
private int SwitchEnum<T>(Enum G)
{
int next = Convert.ToInt32(G) + 1;
if (Enum.IsDefined(typeof(T), next))
{
return next;
}
else
{
return 0;
}
}
您可以按如下方式调用此函数:
MyEnum a = new MyEnum(); //Assuming MyEnum is your enum
a = (MyEnum)SwitchEnum<MyEnum>(a);