IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

Enum dans un combobox WPF MVVM


Sujet :

Windows Presentation Foundation

  1. #1
    Membre averti
    Inscrit en
    Février 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 12
    Par défaut Enum dans un combobox WPF MVVM
    Bonjour,

    voilà j'aurais voulu avoir un petit exemple pour ajouter des items d'une combobox à partir d'un type enum.


    Merci d avance!

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Enum.GetNames(typeof(MonEnum));
    va renvoyer un string[] contenant les nom disponibles dans l'enum qui peut être utilisé comme DataSource.

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mars 2008
    Messages : 28
    Par défaut
    Salut,
    voici une méthode pour binder un enum sur une combobox :

    le xaml :
    tu places cela dans les ressources de ta window :
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		<CollectionViewSource x:Key="TypeEnumList">
    			<CollectionViewSource.Source>
    				<ObjectDataProvider MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
    					<ObjectDataProvider.MethodParameters>
    						<x:Type TypeName="localvm:TypeEnum"/>
    					</ObjectDataProvider.MethodParameters>
    				</ObjectDataProvider>
    			</CollectionViewSource.Source>
    		</CollectionViewSource>

    et la combobox :
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <ComboBox Name="Cbo_TypeEnum"  ItemsSource="{Binding Source={StaticResource TypeEnumList}}"
    						  HorizontalAlignment="Left" Width="280">


    view model :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	public enum TypeEnum
    	{
    		ALL,
    		RUNTIME,
    		SQL
    	}

  4. #4
    Membre averti
    Inscrit en
    Février 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 12
    Par défaut
    Merci bien !!!

  5. #5
    Membre émérite Avatar de jmix90
    Homme Profil pro
    Consultant .Net
    Inscrit en
    Juillet 2007
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 576
    Par défaut
    Hello,

    Sinon j'ai un petit converter qui va chercher l'attribut Display que tu as placé sur un enum et te renvoit un tuple avec la valeur de l'enum et le texte a affiché. C'est bien pratique et cela s'utilise en fournissant le type de l'enum a utiliser depuis le code :

    Code ENUM:

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public enum MonENum{
    [Display(Name="Mon nom a afficher un")]
    ValeurUne,
     
    [Display(Name="Mon nom a afficher deux")]
    ValeurDeux,
     
    }


    Code XAML:

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     <ComboBox 
                        ItemsSource="{Binding LeTypeDeLEnum,Converter={StaticResource EnumToDictionnaryConverter}}"
                        DisplayMemberPath="Item2" SelectedValuePath="Item1"
                        SelectedValue="{Binding SelectedObjectOnViewModel,Mode=TwoWay}" />

    Code du converter :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     public class EnumToDictionnaryConverter : IValueConverter
        {
            private Dictionary<Type, List<Tuple<Object, Object>>> cache = new Dictionary<Type, List<Tuple<Object, Object>>>();
     
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                Type type = value as Type;
                if (!this.cache.ContainsKey(type))
                {
                    var fields = type.GetFields().Where(field => field.IsLiteral);
                    var values = new List<Tuple<Object, Object>>();
                    foreach (var field in fields)
                    {
                        DisplayAttribute[] a = (DisplayAttribute[])field.GetCustomAttributes(typeof(DisplayAttribute), false);
                        if (a != null && a.Length > 0)
                        {
                            Tuple<object, object> newTuple1 = new Tuple<Object, Object>(field.GetValue(value), a[0].Name);
                            values.Add(newTuple1);
                        }
                        else
                        {
                            Tuple<object, object> newTuple = new Tuple<Object, Object>(field.GetValue(value), field.GetValue(value));
                            values.Add(newTuple);
                        }
                    }
                    this.cache[type] = values;
                }
     
                return this.cache[type];
            }
     
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    La technique du ObjectDataProvider fonctionne bien, mais c'est un peu lourd...

    La librairie Dvp.NET fournit une markup extension EnumValuesExtension qui fait la même chose de façon beaucoup plus compacte :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    <ComboBox ItemsSource="{dvp:EnumValues local:MyEnum}" />

  7. #7
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 346
    Par défaut
    Hello,

    je me permets de relancer ce (vieux) sujet car j'ai une question sur la réponse de jmix90:

    Citation Envoyé par jmix90

    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <ComboBox 
                        ItemsSource="{Binding LeTypeDeLEnum,Converter={StaticResource EnumToDictionnaryConverter}}"
                        DisplayMemberPath="Item2" SelectedValuePath="Item1"
                        SelectedValue="{Binding SelectedObjectOnViewModel,Mode=TwoWay}" />
    J'ai évidemment remplacé LeTypeDeLEnum par mon type d'énumération. Le compilateur indique (à juste titre) qu'il ne trouve pas la propriété LeTypeDeLEnum sur l'objet lié au DataContext.
    Est-ce que c'est la bonne syntaxe ?

    Merci d'avance,
    Zoax

  8. #8
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Il doit falloir mettre un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {x:Type monnamespacexml:montype}

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Nathanael Marchand Voir le message
    Il doit falloir mettre un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {x:Type monnamespacexml:montype}
    Je dirais même qu'il faut mettre Source={x:Type namespace:type}, et pas de Path...

    Enfin cette solution me semble quand même beaucoup plus compliquée que la markup extension mentionnée dans ma réponse

  10. #10
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 346
    Par défaut
    Bonjour,

    merci pour les réponses, je vais essayer ça tout de suite.

    Citation Envoyé par tomlev
    Enfin cette solution me semble quand même beaucoup plus compliquée que la markup extension mentionnée dans ma réponse
    Justement je suis en train d'essayer les différentes solutions que vous aviez proposé. J'ai d'ailleurs laissé un autre message à ce sujet sur le forum. Tu l'as peut-être vu ?

    Zoax.

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par zoaax Voir le message
    Justement je suis en train d'essayer les différentes solutions que vous aviez proposé. J'ai d'ailleurs laissé un autre message à ce sujet sur le forum. Tu l'as peut-être vu ?
    Pas encore, mais je vais voir

  12. #12
    Membre émérite Avatar de jmix90
    Homme Profil pro
    Consultant .Net
    Inscrit en
    Juillet 2007
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 576
    Par défaut
    il y a un article complet sur le sujet : http://www.jonathanantoine.com/2011/...-descriptions/

  13. #13
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 346
    Par défaut
    C'est génial. Super idée.

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation Enum dans une fenetre WPF en XAML
    Par hanubis37 dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 29/11/2014, 10h13
  2. [C#] combobox WPF modèle MVVM
    Par july4474 dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 29/11/2010, 18h16
  3. Comment Afficher un Combobox dans une Gridview WPF avec le code seulement?
    Par aminems dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 25/08/2010, 13h48
  4. [SL 4] [RIA MVVM] Perte de binding dans les combobox
    Par stailer dans le forum Silverlight
    Réponses: 4
    Dernier message: 13/08/2010, 16h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo