Вы можете еще больше упростить принятый ответ. Вместо того, чтобы печатать перечисления в виде строк в xaml и выполнять в конвертере больше работы, чем необходимо, вы можете явно передать значение перечисления вместо строкового представления, и, как прокомментировал 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.
Примечание. Несколько групп радиокнопок в одном контейнере (17 февраля 2011 г.):
В xaml, если переключатели совместно используют один и тот же родительский контейнер, выбор одного из них отменяет выбор всех других в этом контейнере (даже если они связаны с другим свойством). Поэтому постарайтесь сохранить ваши RadioButton, связанные с общим свойством, сгруппированными в их собственном контейнере, как панель стека. В тех случаях, когда ваши связанные RadioButtons не могут совместно использовать один родительский контейнер, установите для свойства GroupName каждого RadioButton общее значение, чтобы логически сгруппировать их.
Изменить (5 апреля '11):
Упрощенное использование ConvertBack if-else для использования тернарного оператора.
Примечание. Тип перечисления, вложенный в класс (28 апреля 2011 г.):
Если ваш тип перечисления вложен в класс (а не непосредственно в пространство имен), вы можете использовать синтаксис «+» для доступа к перечислению в XAML, как указано в (не отмеченном) ответе на вопрос «
Невозможно найти» Тип enum для статической ссылки в WPF :
ConverterParameter = {x: Статический локальный: YourClass + YourNestedEnumType.Enum1}
Однако из-за этой проблемы с Microsoft Connect дизайнер в VS2010 больше не будет загружать отчеты "Type 'local:YourClass+YourNestedEnumType' was not found."
, но проект компилируется и успешно выполняется. Конечно, вы можете избежать этой проблемы, если сможете напрямую переместить тип enum в пространство имен.
Изменить (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 возвращает ноль из БД или всякий раз, когда может иметь смысл, что в логике программы значение не указано), не забудьте добавить начальная нулевая проверка в методе Convert и возвращение соответствующего значения 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>
кажется разумным решением.