J'ai une énumération comme celle-ci:
public enum MyLovelyEnum
{
FirstSelection,
TheOtherSelection,
YetAnotherOne
};
J'ai une propriété dans mon DataContext:
public MyLovelyEnum VeryLovelyEnum { get; set; }
Et j'ai obtenu trois RadioButtons dans mon client WPF.
<RadioButton Margin="3">First Selection</RadioButton>
<RadioButton Margin="3">The Other Selection</RadioButton>
<RadioButton Margin="3">Yet Another one</RadioButton>
Maintenant, comment lier les RadioButtons à la propriété pour une liaison bidirectionnelle appropriée?
Réponses:
Vous pourriez utiliser un convertisseur plus générique
Et dans la partie XAML que vous utilisez:
la source
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}
Simplifiez ensuite le convertisseur:
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: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: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 retourNullable<Boolean>
semble une solution raisonnable.la source
Pour la réponse EnumToBooleanConverter: Au lieu de renvoyer DependencyProperty.UnsetValue, envisagez de renvoyer Binding.DoNothing dans le cas où la valeur IsChecked du bouton radio devient fausse. Le premier indique un problème (et peut montrer à l'utilisateur un rectangle rouge ou des indicateurs de validation similaires) tandis que le second indique simplement que rien ne doit être fait, ce qui est souhaité dans ce cas.
http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.convertback.aspx http://msdn.microsoft.com/en-us/library/system.windows.data.binding .donothing.aspx
la source
J'utiliserais les RadioButtons dans une ListBox, puis je me lierais à la SelectedValue.
Il s'agit d'un fil plus ancien sur ce sujet, mais l'idée de base doit être la même: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/323d067a-efef-4c9f-8d99-fecf45522395/
la source
Pour UWP, ce n'est pas si simple: vous devez sauter à travers un cercle supplémentaire pour passer une valeur de champ comme paramètre.
Exemple 1
Valable pour WPF et UWP.
Exemple 2
Valable pour WPF et UWP.
Exemple 3
Valable uniquement pour WPF!
UWP ne prend pas en charge,
x:Static
donc l' exemple 3 est hors de question; en supposant que vous allez avec l' exemple 1 , le résultat est un code plus détaillé. L'exemple 2 est légèrement meilleur, mais n'est toujours pas idéal.Solution
Ensuite, pour chaque type que vous souhaitez prendre en charge, définissez un convertisseur qui encadre le type enum.
La raison pour laquelle il doit être encadré est qu'il n'y a apparemment aucun moyen de référencer le type dans la
ConvertBack
méthode; la boxe s'en occupe. Si vous choisissez l'un des deux premiers exemples, vous pouvez simplement référencer le type de paramètre, éliminant ainsi la nécessité d'hériter d'une classe encadrée; si vous souhaitez tout faire en une seule ligne et avec le moins de verbosité possible, cette dernière solution est idéale.L'utilisation ressemble à l' exemple 2 , mais est en fait moins verbeuse.
L'inconvénient est que vous devez définir un convertisseur pour chaque type que vous souhaitez prendre en charge.
la source
J'ai créé une nouvelle classe pour gérer la liaison des RadioButtons et CheckBoxes aux énumérations. Il fonctionne pour les énumérations marquées (avec plusieurs sélections de cases à cocher) et les énumérations non marquées pour les cases à cocher à sélection unique ou les boutons radio. Il ne nécessite également aucun convertisseur de valeur.
Cela peut sembler plus compliqué au début, cependant, une fois que vous avez copié cette classe dans votre projet, c'est fait. Il est générique et peut donc être facilement réutilisé pour n'importe quelle énumération.
Et pour savoir comment l'utiliser, disons que vous disposez d'une énumération pour exécuter une tâche manuellement ou automatiquement, et pouvez être planifiée pour n'importe quel jour de la semaine, et certaines options facultatives ...
Maintenant, voici à quel point il est facile d'utiliser cette classe:
Et voici à quel point il est facile de lier des cases à cocher et des boutons radio avec cette classe:
la source
EnumSelection<StartTask>
objet. Si vous regardez la définition deEnumSelection<T>
vous pouvez voir qu'elle a une propriété Value. Le modèle de vue n'a donc pas besoin d'avoir une "SelectedStartTask". Vous utiliseriezStartUp.Value
. Et comme pour avoir une valeur par défaut de Undefined, voir la 3ème énumération, AdditionalOptions, il a un None au lieu d'un Undefined, mais vous pouvez changer le nom de celui-ci comme vous le souhaitez.Cela fonctionne également pour Checkbox .
Lier une seule énumération à plusieurs cases à cocher.
la source
Basé sur le EnumToBooleanConverter de Scott. J'ai remarqué que la méthode ConvertBack ne fonctionne pas sur le code Enum with flags.
J'ai essayé le code suivant:
La seule chose que je n'arrive pas à travailler est de faire un casting de
int
àtargetType
donc je l'ai fait en durNavigationProjectDates
, enum que j'utilise. EttargetType == NavigationProjectDates
...Modifier pour un convertisseur d'énumérations plus générique:
la source
Vous pouvez créer les boutons radio dynamiquement,
ListBox
peut vous aider à le faire, sans convertisseurs, assez simple.Les étapes concrètes sont les suivantes: créer un ListBox et définir le ItemsSource pour la listbox comme énumération
MyLovelyEnum
et lier le SelectedItem du ListBox à laVeryLovelyEnum
propriété. Ensuite, les boutons radio pour chaque ListBoxItem seront créés.Control Template
pour remplir chaque élément à l'intérieur en tant que bouton radioL' avantage est ci-dessous: si un jour votre classe enum change, vous n'avez pas besoin de mettre à jour l'interface graphique (fichier XAML).
Références: https://brianlagunas.com/a-better-way-to-data-bind-enums-in-wpf/
la source