C# 使用值转换器将切换按钮绑定到枚举

C# 使用值转换器将切换按钮绑定到枚举,c#,wpf,ivalueconverter,C#,Wpf,Ivalueconverter,我正在处理的项目定义了一个枚举,该枚举只有两个状态。我正在使用切换按钮切换属性值 使用我为将枚举绑定到一组单选按钮而编写的值转换器是不起作用的,因为它只会以一种方式更改值,这是由于绑定了的缘故 以下是仅在一个方向上更改值的单选按钮所用的枚举到布尔值转换器: public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return value.Equals(par

我正在处理的项目定义了一个枚举,该枚举只有两个状态。我正在使用切换按钮切换属性值

使用我为将枚举绑定到一组单选按钮而编写的值转换器是不起作用的,因为它只会以一种方式更改值,这是由于绑定了
的缘故

以下是仅在一个方向上更改值的单选按钮所用的枚举到布尔值转换器:

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;
}
作为一种解决方法,我专门针对我正在使用的枚举修改了它,如下所示,在
ConvertBack
方法中将
Binding.DoNothing
替换为
MyEnum.Off

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

是否有更好的方法来切换返回的枚举值,以启用切换按钮将枚举切换到关闭状态,从而可在不同的枚举类型之间重复使用?

如果您认为枚举只有两种状态,只使用bool不是更简单吗?然后您可以将其外部化为一个函数,该函数根据bool的当前值将bool切换为true/false

编辑: 读了@Kevin留下的评论后,我意识到我误解了最初的问题。下面的内容应该更符合你的要求。它将获取一个enum T并对其进行迭代,返回序列中每个下一项的
int
索引,直到到达末尾,然后再次返回第一项(0)

private int SwitchEnum(枚举G)
{                        
int next=Convert.ToInt32(G)+1;
如果(枚举已定义(类型(T),下一个))
{
下一步返回;
}
其他的
{
返回0;
}
}
您可以按如下方式调用此函数:

    MyEnum a = new MyEnum(); //Assuming MyEnum is your enum
    a = (MyEnum)SwitchEnum<MyEnum>(a);
MyEnum a=new MyEnum()//假设MyEnum是您的枚举
a=(MyEnum)SwitchEnum(a);

没有任何类型/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:只接受
SByte、Int16、Int32、Int64、Byte、UInt16、UInt32或UInt64。
,但我怀疑它使用
系统。内部转换
,因此也接受布尔值。

您是否考虑过
转换回(…)中的
targetType
method?@Silvermind我不太确定这是怎么回事,但这应该是可能的。您对如何实现这一点有什么建议吗?使用bool将不再需要UI和viewModel属性之间的转换器,但我仍然需要在viewModel中的某个点在bool和Enum之间进行转换,然后在系统的其余部分使用Enum,这样就不需要转换器,它只是移动它。我误解了。请参阅编辑。这非常有效,boolean确实是
Enum.ToObject()
方法中可接受的值。
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);
}