478 votes

Comment lier les cases d’option à un enum ?

J’ai un enum comme ceci :

J’ai obtenu une propriété dans mon DataContext :

Et j’ai eu trois cases d’option dans mon client de WPF.

Maintenant comment lier les cases d’option à la propriété pour two-way-liaison correcte ?

639voto

Scott Points 6085

Vous pouvez poursuivre la simplification de la accepté de répondre. Au lieu de taper les énumérations comme des chaînes de caractères dans le code xaml et faire plus de travail dans votre convertisseur de besoin, vous pouvez transmettre explicitement dans la valeur d'enum au lieu d'une représentation de chaîne, et que CrimsonX commenté, les erreurs jeté au moment de la compilation plutôt que de l'exécution:

ConverterParameter={x:Static locale:YourEnumType.Enum1}

<StackPanel>
    <StackPanel.Resources>          
        <local:EnumToBooleanConverter x:Key="EnumToBooleanConverter" />          
    </StackPanel.Resources>
    <RadioButton IsChecked="{Binding Path=YourEnumProperty, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter={x:Static local:YourEnumType.Enum1}}" />
    <RadioButton IsChecked="{Binding Path=YourEnumProperty, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter={x:Static local:YourEnumType.Enum2}}" />
</StackPanel>

Puis simplifier du convertisseur:

public class EnumToBooleanConverter : 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) ? parameter : Binding.DoNothing;
    }
}

Remarque - Plusieurs groupes de composants radiobutton dans le même conteneur (Fév 17 '11):

En xaml, si les boutons radio partager le même conteneur parent, puis en sélectionnant l'une de sélectionner tous les autres dans ce conteneur (même s'ils sont liés à une propriété différente). Donc, essayez de garder votre du composant RadioButton qui sont liés à une propriété commune regroupées au sein de leur propre conteneur comme une pile du panneau. Dans le cas où vos composants radiobutton ne peut pas partager un seul conteneur parent, puis définissez la propriété GroupName de chaque composant RadioButton à une valeur commune pour regrouper logiquement.

Remarque - Enum type imbriqué dans une classe (le 28 Avril '11):

Si votre type enum est imbriquée dans une classe (plutôt que directement dans l'espace), vous pourriez être en mesure d'utiliser le " + " de la syntaxe pour accéder à l'enum dans le code XAML comme indiqué dans un (non marqués) réponse à la question de l'Impossibilité à trouver un type enum statique de référence en WPF:

ConverterParameter={x:Static locale:YourClass+YourNestedEnumType.Enum1}

En raison de ce Microsoft Connect Question, toutefois, le concepteur dans VS2010 n'aura plus la charge en déclarant "Type 'local:YourClass+YourNestedEnumType' was not found.", mais le projet n'a compiler et exécuter avec succès. Bien sûr, vous pouvez éviter ce problème si vous êtes en mesure de déplacer votre type enum à l'espace de noms directement.

Edit (Dec 16 '10):

Grâce à anon pour suggérer le retour de Liaison.Ne rien faire plutôt que de DependencyProperty.UnsetValue.

Edit Apr (5 '11):

Simplifié ConvertBack de l'if-else pour utiliser un Opérateur Ternaire.

Edit (Jan 27 '12):

Si vous utilisez le protocole Enum drapeaux, le convertisseur devrait être comme suit:

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;
    }
}

417voto

Lars Points 3032

Vous pouvez utiliser un convertisseur plus générique

Et dans la partie XAML, vous utilisez :

28voto

anon Points 151

Pour le EnumToBooleanConverter réponse: Au lieu de retourner DependencyProperty.UnsetValue envisager un retour de la Liaison.Ne rien faire pour le cas où le bouton radio IsChecked valeur est false. L'ancien indique un problème (et peut afficher à l'utilisateur un rectangle rouge ou similaire validation des indicateurs) tandis que le second indique simplement que rien ne devrait être fait, qui est ce qui est voulu 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

5voto

Martin Moser Points 321

J’utiliser les cases d’option dans un contrôle ListBox et puis lier à SelectedValue.

Il s’agit d’un vieux filet sur ce sujet, mais l’idée de base devrait être la même : http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/323d067a-efef-4c9f-8d99-fecf45522395/

2voto

Artiom Points 1228

Aussi vous pouvez créer un contrôle personnalisé et que vous n’aurez pas besoin d’écrire beaucoup de code chaque fois à des fins générales Enum contrôle radio button

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X