Привязка кнопки переключения к перечислению с помощью преобразователя значений
Проект, над которым я работаю, имеет определенное перечисление, которое имеет только два состояния. Я использую кнопку переключения для переключения значения свойства.
Использование преобразователя значений, который я написал для привязки перечислений к набору переключателей, не работает, так как он изменяет значение только в одну сторону из-за 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 ответа:
Самым простым без проверки типа / 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);