Ви можете додатково спростити прийняту відповідь. Замість того, щоб вводити переліки як рядки в xaml і робити більше роботи в конвертері, ніж потрібно, ви можете явно передавати значення enum замість рядкового представлення, і, як прокоментував CrimsonX, помилки викидаються під час компіляції, а не під час виконання:
ConverterParameter = {x: Статичний локальний: YourEnumType.Enum1}
<StackPanel>
<StackPanel.Resources>
<local:ComparisonConverter x:Key="ComparisonConverter" />
</StackPanel.Resources>
<RadioButton IsChecked="{Binding Path=YourEnumProperty, Converter={StaticResource ComparisonConverter}, ConverterParameter={x:Static local:YourEnumType.Enum1}}" />
<RadioButton IsChecked="{Binding Path=YourEnumProperty, Converter={StaticResource ComparisonConverter}, ConverterParameter={x:Static local:YourEnumType.Enum2}}" />
</StackPanel>
Потім спростіть перетворювач:
public class ComparisonConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value?.Equals(parameter);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value?.Equals(true) == true ? parameter : Binding.DoNothing;
}
}
Редагувати (16 грудня '10):
Завдяки anon за те, що запропонував повернути Binding.DoNothing, а не DependencyProperty.UnsetValue.
Примітка. Кілька груп RadioButtons в одному контейнері (17 лютого 11):
У xaml, якщо перемикачі перемикають один і той же батьківський контейнер, тоді, якщо вибрати один, буде вибрано всі інші в цьому контейнері (навіть якщо вони пов'язані з іншим властивістю). Тому спробуйте зберегти свої RadioButton, які прив'язані до спільної властивості, згрупованої разом у власному контейнері, як панель стеків. У випадках, коли ваші пов'язані RadioButtons не можуть поділитись єдиним батьківським контейнером, тоді встановіть для властивості GroupName кожного RadioButton загальне значення для логічного їх групування.
Редагувати (5 квітня '11):
Спрощена програма ConvertBack, якщо потрібно використовувати термінальний оператор.
Примітка - Тип Enum вкладений у класі (28 квітня '11):
Якщо ваш тип enum вкладений у класі (а не безпосередньо у просторі імен), ви можете використовувати синтаксис '+' для доступу до enum у XAML, як зазначено у (не позначеному) відповіді на запитання
Неможливо знайти тип enum для статичної довідки у WPF :
ConverterParameter = {x: Статичний локальний: YourClass + YourNestedEnumType.Enum1}
Завдяки цьому Microsoft Connect Issue , дизайнер у VS2010 більше не завантажує констатування "Type 'local:YourClass+YourNestedEnumType' was not found."
, але проект компілюється та працює успішно. Звичайно, ви можете уникнути цього питання, якщо зможете безпосередньо перемістити тип перерахунку до простору імен.
Редагувати (27 січня '12):
Якщо використовується прапорці Enum, перетворювач буде таким:
public class EnumToBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return ((Enum)value).HasFlag((Enum)parameter);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value.Equals(true) ? parameter : Binding.DoNothing;
}
}
Редагувати (7 травня '15):
У випадку з Nullable Enum (це
не задається питанням, але воно може знадобитися в деяких випадках, наприклад, ORM, що повертає нуль з БД, або коли це може мати сенс, що в логіці програми значення не передбачено), не забудьте додати початкова нульова перевірка методу конвертування та повернення відповідного значення bool, яке, як правило, є помилковим (якщо ви не бажаєте, щоб було вибрано жодну радіо-кнопку), як показано нижче:
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null) {
return false; // or return parameter.Equals(YourEnumType.SomeDefaultValue);
}
return value.Equals(parameter);
}
Примітка - NullReferenceException (10 жовтня 18):
Оновлено приклад, щоб видалити можливість викидання NullReferenceException.
IsChecked
є змінним типом, тому повернення
Nullable<Boolean>
здається розумним рішенням.