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

时间:2016-03-09 18:10:26

标签: c# wpf ivalueconverter

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

使用我编写的用于将枚举绑定到一组单选按钮的值转换器不起作用,因为它仅因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;
    }

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

2 个答案:

答案 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);