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

Binding a toggle button to an enum using a value converter

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

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

作为解决方法,我专门针对我正在使用的枚举修改了它,如下所示,在 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;
    }

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

如果枚举只有 2 个状态,使用布尔值不是更简单吗?然后,您可以将其外部化为一个函数,该函数根据其当前值

将 bool 切换为 true/false

编辑: 阅读@Kevin 留下的评论后,我意识到我误解了原来的问题。希望以下内容更符合您的要求。它将获取一个枚举 T 并遍历它,returning 序列中每个下一项的 int 索引,直到它到达末尾,在那里它将再次 return 第一项( 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);

没有任何 type/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 接受任何 value 类型而不抛出异常。

您还可以进行一些额外的类型检查,例如 if (targetType.IsEnum),但这取决于您。

根据 msdn:Enum.ToObject() 只接受 SByte, Int16, Int32, Int64, Byte, UInt16, UInt32, or UInt64.,但我怀疑它在内部使用 System.Convert,因此也接受布尔值。