Привязка кнопки переключения к перечислению с помощью преобразователя значений


Проект, над которым я работаю, имеет определенное перечисление, которое имеет только два состояния. Я использую кнопку переключения для переключения значения свойства.

Использование преобразователя значений, который я написал для привязки перечислений к набору переключателей, не работает, так как он изменяет значение только в одну сторону из-за Binding.DoNothing.

Вот преобразователь enum в boolean, используемый для переключателей, который изменяет значение только в одном направлении:

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

Есть ли лучший способ переключить это возвращаемое значение перечисления, чтобы включить переключатель для переключения перечисления в состояние off, которое будет повторно использоваться в разных типах перечислений?

2 3

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 принимает любой тип value без создания исключения.

Вы также можете выполнить дополнительную проверку типа, например if (targetType.IsEnum), но это зависит от вас.

Согласно msdn: Enum.ToObject() принимает только SByte, Int16, Int32, Int64, Byte, UInt16, UInt32, or UInt64., но я подозреваю, что он использует System.Convert внутренне, поэтому булево также принимается.

Если у вас перечисление имеет только 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);