Vous pouvez encore simplifier la réponse acceptée. Au lieu de taper les énumérations sous forme de chaînes dans xaml et de faire plus de travail dans votre convertisseur que nécessaire, vous pouvez explicitement passer la valeur enum au lieu d'une représentation sous forme de chaîne, et comme l'a commenté CrimsonX, les erreurs sont générées au moment de la compilation plutôt qu'à l'exécution:
ConverterParameter = {x: Local statique: 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>
Simplifiez ensuite le convertisseur:
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;
}
}
Modifier (16 décembre 10):
Merci à anon d'avoir suggéré de retourner Binding.DoNothing plutôt que DependencyProperty.UnsetValue.
Remarque - Plusieurs groupes de RadioButtons dans le même conteneur (17 février 2011):
Dans xaml, si les boutons radio partagent le même conteneur parent, la sélection d'un désélectionnera tous les autres contenus dans ce conteneur (même s'ils sont liés à une propriété différente). Essayez donc de garder vos RadioButton liés à une propriété commune regroupés dans leur propre conteneur comme un panneau de pile. Dans les cas où vos RadioButtons associés ne peuvent pas partager un seul conteneur parent, définissez la propriété GroupName de chaque RadioButton sur une valeur commune pour les regrouper logiquement.
Edit (5 avril 11):
If-else de ConvertBack simplifié pour utiliser un opérateur ternaire.
Remarque - Type d'énumération imbriqué dans une classe (28 avril 2011):
Si votre type d'énumération est imbriqué dans une classe (plutôt que directement dans l'espace de noms), vous pourrez peut-être utiliser la syntaxe '+' pour accéder à l'énumération en XAML comme indiqué dans une réponse (non marquée) à la question
Impossible de trouver type enum pour référence statique dans WPF :
ConverterParameter = {x: Local statique: YourClass + YourNestedEnumType.Enum1}
En raison de ce problème de connexion Microsoft , cependant, le concepteur dans VS2010 ne chargera plus la déclaration "Type 'local:YourClass+YourNestedEnumType' was not found."
, mais le projet se compile et s'exécute correctement. Bien sûr, vous pouvez éviter ce problème si vous pouvez déplacer directement votre type d'énumération dans l'espace de noms.
Edit (27 janvier 12):
Si vous utilisez des drapeaux Enum, le convertisseur serait le suivant:
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;
}
}
Edit (7 mai 15):
Dans le cas d'une énumération Nullable (ce qui n'est
pas demandé dans la question, mais peut être nécessaire dans certains cas, par exemple, ORM renvoyant null à partir de la base de données ou chaque fois qu'il peut être logique que dans la logique du programme la valeur ne soit pas fournie), n'oubliez pas d'ajouter une vérification initiale nulle dans la méthode de conversion et renvoyer la valeur booléenne appropriée, qui est généralement fausse (si vous ne voulez pas de bouton radio sélectionné), comme ci-dessous:
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);
}
Remarque - NullReferenceException (10 octobre 2018):
Mise à jour de l'exemple pour supprimer la possibilité de lever une NullReferenceException.
IsChecked
est un type nullable, donc le retour
Nullable<Boolean>
semble une solution raisonnable.