Puede simplificar aún más la respuesta aceptada. En lugar de escribir las enumeraciones como cadenas en xaml y hacer más trabajo en su convertidor de lo necesario, puede pasar explícitamente el valor de enumeración en lugar de una representación de cadena, y como CrimsonX comentó, los errores se generan en tiempo de compilación en lugar de tiempo de ejecución:
ConverterParameter = {x: Local estático: 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>
Luego simplifica el convertidor:
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;
}
}
Editar (16 de diciembre de 2010):
Gracias a anon por sugerir devolver Binding.DoNothing en lugar de DependencyProperty.UnsetValue.
Nota - Varios grupos de RadioButtons en el mismo contenedor (17 de febrero de 2011):
En xaml, si los botones de opción comparten el mismo contenedor principal, al seleccionar uno se desmarcarán todos los demás dentro de ese contenedor (incluso si están vinculados a una propiedad diferente). Así que trate de mantener sus RadioButton que están vinculados a una propiedad común agrupados en su propio contenedor como un panel de pila. En los casos en que sus RadioButtons relacionados no puedan compartir un solo contenedor primario, configure la propiedad GroupName de cada RadioButton en un valor común para agruparlos lógicamente.
Editar (5 de abril de 2011):
Simplificado ConvertBack's if-else para usar un operador ternario.
Nota - Tipo de enumeración anidado en una clase (28 de abril de 2011):
Si su tipo de enumeración está anidado en una clase (en lugar de directamente en el espacio de nombres), puede usar la sintaxis '+' para acceder a la enumeración en XAML como se indica en una respuesta (no marcada) a la pregunta
No se puede encontrar tipo de enumeración para referencia estática en WPF :
ConverterParameter = {x: Local estático: YourClass + YourNestedEnumType.Enum1}
Sin embargo, debido a este problema de Microsoft Connect , el diseñador en VS2010 ya no cargará la declaración "Type 'local:YourClass+YourNestedEnumType' was not found."
, pero el proyecto se compila y ejecuta con éxito. Por supuesto, puede evitar este problema si puede mover su tipo de enumeración al espacio de nombres directamente.
Editar (27 de enero de 12):
Si usa banderas Enum, el convertidor sería el siguiente:
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;
}
}
Editar (7 de mayo '15):
En el caso de una enumeración anulable (eso
no se hace en la pregunta, pero puede ser necesario en algunos casos, por ejemplo, ORM devuelve nulo de DB o cuando tenga sentido que en la lógica del programa no se proporcione el valor), recuerde agregar una verificación nula inicial en el Método de conversión y devuelve el valor bool apropiado, que generalmente es falso (si no desea que se seleccione ningún botón de radio), como a continuación:
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);
}
Nota - NullReferenceException (10 de octubre de 18):
Se actualizó el ejemplo para eliminar la posibilidad de lanzar una NullReferenceException.
IsChecked
es un tipo anulable, por lo que regresar
Nullable<Boolean>
parece una solución razonable.