Вы можете еще больше упростить принятый ответ. Вместо того чтобы печатать перечисления в виде строк в xaml и выполнять в конвертере больше работы, чем необходимо, вы можете явно передать значение перечисления вместо строкового представления, и, как прокомментировал CrimsonX, ошибки генерируются во время компиляции, а не во время выполнения: 1001 *
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;
}
}
Примечание - исключение NullReferenceException (10 октября '18):
Обновлен пример, чтобы исключить возможность создания исключения NullReferenceException.
IsChecked
является обнуляемым типом, поэтому возврат
Nullable<Boolean>
кажется разумным решением.
Примечание. Несколько групп радиокнопок в одном контейнере (17 февраля '11 г.):
В xaml, если переключатели совместно используют один и тот же родительский контейнер, выбор одного из них отменяет выбор всех других в этом контейнере (даже если они связаны с другим свойством). Поэтому постарайтесь сохранить ваши RadioButton, связанные с общим свойством, сгруппированными в их собственном контейнере, как панель стека. В тех случаях, когда связанные с вами RadioButtons не могут совместно использовать один родительский контейнер, установите для свойства GroupName каждого RadioButton общее значение для их логической группировки.
Примечание. Тип перечисления, вложенный в класс (28 апреля '11 г.):
Если ваш тип перечисления вложен в класс (а не непосредственно в пространство имен), вы можете использовать синтаксис «+» для доступа к перечислению в XAML, как указано в (не отмеченном) ответе на вопрос
Невозможно найти тип перечисления для статической ссылки в WPF :
ConverterParameter = {x: Статический локальный: YourClass + YourNestedEnumType.Enum1}
Из-за этого Microsoft Connect Issue , однако, конструктор в VS2010 больше не будет загружать с указанием "Type 'local:YourClass+YourNestedEnumType' was not found."
, но проект компилируется и успешно выполняется. Конечно, вы можете избежать этой проблемы, если сможете напрямую переместить тип enum в пространство имен.
Редактировать (16 декабря '10):
Спасибо anon за предложение вернуть Binding.DoNothing вместо DependencyProperty.UnsetValue.
Редактировать (5 апреля '11):
Упрощенное использование ConvertBack if-else для использования тернарного оператора.
Редактировать (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, которое обычно равно false (если вы не хотите выбирать какую-либо радиокнопку), как показано ниже:
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);
}