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

C# Discussion :

Enum binding combobox


Sujet :

C#

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur Junior développement logiciels
    Inscrit en
    Mai 2014
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Junior développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 198
    Points : 113
    Points
    113
    Par défaut Enum binding combobox
    Bonjour,

    Je suis actuellement dans une impasse et je ne vois pas comment résoudre mon problème, je cherche à créer une ComboBox qui serai binder sur un type Enum.

    Je n'arrive pas à créer une ComboBox afin de choisir la valeur du champ (BonLivraisonRecu par exemple) ainsi que de mettre à disposition toutes les valeurs possibles dans celle-ci (Oui, Non, En Partie).

    Mon Enum est uniquement dans ma classe modèle et est définit/utilisé comme suit :

    Code : 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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
     public partial class CommandeFournisseur : EntityObject, IDataErrorInfo
        {
            public enum EtatCommandeFournisseur
            {
                [Description("En cours")]
                Encours = 0,
                [Description("Annulé")]
                Annuler = 1
            }
     
            public enum Reception
            {
                [Description("Oui")]
                Oui = 0,
                [Description("Non")]
                Non = 1,
                [Description("En Partie")]
                EnPartie = 2
            }
     
       public EtatCommandeFournisseur Etat
            {
                get
                {
                    return (EtatCommandeFournisseur)CodeEtat;
                }
     
                set
                {
                    CodeEtat = (int)value;
                }
            }
     
     
            public Reception BonLivraisonRecu
            {
                get
                {
                    return (Reception)CodeBonLivraisonRecu;
                }
                set
                {
                    CodeBonLivraisonRecu = (int)value;
                }
            }
     
            public Reception FactureRecu
            {
                get
                {
                    return (Reception)CodeFactureRecu;
                }
                set
                {
                    CodeFactureRecu = (int)value;
                }
            }
         }
    Cela nous permet de faire un cast afin d'enregistrer l'entier correspondant dans la base de données


    De plus mon ViewModel contient une ObservableCollection de ladite classe.

    Mon problème est que le code qui suit me donne une combobox vide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                                <ComboBox ItemsSource="{Binding CommandeFournisseur.Reception}"
                                          DisplayMemberPath="Description"
                                          SelectedValuePath="Value"/>
    CommandeFournisseur.Reception est le type enum définit dans la classe CommandeFournisseur



    Merci d'avance

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Bonjour,

    ta combox est vide car tu as une erreur de binding.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     <ComboBox ItemsSource="{Binding CommandeFournisseur.Reception}"
                                          DisplayMemberPath="Description"
                                          SelectedValuePath="Value"/>
    "CommandeFournisseur.Reception" est un object de type Type. Cette objet n'a pas de membre "Description", ou "Value".

    La première etape pour faire remplir ta combox est créer une collection avec les differente valeur de l'enum.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <ObjectDataProvider x:Key="ReceptionEnum" 
                            ObjectType="{x:Type system:Enum}" 
                            MethodName="GetValues" >
            <ObjectDataProvider.MethodParameters>
                <x:Type TypeName="namespaceDeCommandeFournisseur:CommandeFournisseur.Reception" />
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    Là j'ai choisie d'utiliser la méthode "GetValues", mais tu peux très bien utiliser "GetNames"

    Apres il te suffit de binding sur la ressource

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <ComboBox ItemsSource="{Binding Source={StaticResource ReceptionEnum}}"
                                    SelectedIndex="0">
    </ComboBox>
    Si tu veux avoir un affichage personialiser, il faut passer par un converter, qui va analyser par reflection ton enum.

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur Junior développement logiciels
    Inscrit en
    Mai 2014
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Junior développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 198
    Points : 113
    Points
    113
    Par défaut
    Ok.

    Je vais essayer d'appliquer ta solution qui me paraît mieux que celle que j'ai mise en place de manière temporaire.

    Qui créer un dictionnaire à partir du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     private Dictionary<int, string> _test = null;
            public Dictionary<int,string> test
            {
                get
                {
                    var type = this.CommandeFournisseur.BonLivraisonRecu.GetType();
                    Dictionary<int,string> t = new Dictionary<int,string>();
                    t=Enum.GetValues(type).Cast<int>().ToDictionary(e => e, e => Enum.GetName(type, e));
                    return t;
                }
            }
    Je mettrais le topic en résolu dès que j'aurai appliqué la solution.

    Merci de ton aide.

  4. #4
    Membre régulier
    Homme Profil pro
    Ingénieur Junior développement logiciels
    Inscrit en
    Mai 2014
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Junior développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 198
    Points : 113
    Points
    113
    Par défaut
    Je re up le topic car la solution mentionner pose problème.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <ObjectDataProvider x:Key="ReceptionEnum" 
                            ObjectType="{x:Type system:Enum}" 
                            MethodName="GetValues" >
            <ObjectDataProvider.MethodParameters>
                <x:Type TypeName="namespaceDeCommandeFournisseur:CommandeFournisseur.Reception" />
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>


    Car namespaceDeCommandeFournisseur:CommandeFournisseur.Reception fait parti du model.

    Travaillant en MVVM il n'est pas judicieux de faire un lien vers le model de cette façon non ?

    Mon Enum fait partie de la classe CommandeFournisseur.

    Je ne sais toujour pas comment faire pour respecter le MVVM.



    Edit :

    Pour le moment j'ai fait ceci :

    Dans mon ViewModel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     private IEnumerable<CommandeFournisseur.Reception> _Recep;
            public IEnumerable<CommandeFournisseur.Reception> Recep
            {
                get
                {
                    return Enum.GetValues(typeof(CommandeFournisseur.Reception)).Cast<CommandeFournisseur.Reception>();
                }
            }
    Dans ma View :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <ComboBox ItemsSource="{Binding Recep}"
                                          SelectedValue="{Binding CommandeFournisseur.BonLivraisonRecu}"
    Cela fonctionne mais je me demande si y a pas mieux à faire...

  5. #5
    Membre émérite Avatar de meziantou
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Points : 2 439
    Points
    2 439
    Par défaut
    J'ai écrit un article sur le sujet, WPF et les enumerations. A la place de DescriptionAttribute, je préfère utiliser DisplayAttribute.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        public partial class CommandeFournisseur
        {
            public enum EtatCommandeFournisseur
            {
                [Display(Name = "En cours")]
                Encours = 0,
                [Display(Name = "Annulé")]
                Annuler = 1
            }
        }
    Code : 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
    <Grid>
        <Grid.Resources>
            <ObjectDataProvider MethodName="GetValues" ObjectType="{x:Type sys:Enum}" x:Key="EtatCommandeFournisseurProvider">
                <ObjectDataProvider.MethodParameters>
                    <x:Type TypeName="demo:CommandeFournisseur+EtatCommandeFournisseur" /> <!-- Comme l enum est dans une classe, on n'utilise pas un "." mais un "+"  -->
                </ObjectDataProvider.MethodParameters>
            </ObjectDataProvider>
     
            <demo:EnumValueConverter x:Key="EnumValueConverter" />
        </StackPanel.Resources>
     
        <ComboBox ItemsSource="{Binding Source={StaticResource EtatCommandeFournisseurProvider}}">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Converter={StaticResource EnumValueConverter}}"/>
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>
    </Grid>

  6. #6
    Membre régulier
    Homme Profil pro
    Ingénieur Junior développement logiciels
    Inscrit en
    Mai 2014
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Junior développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 198
    Points : 113
    Points
    113
    Par défaut
    Bonjour,

    Quand vous ecrivez ceci :
    <x:Type TypeName="demo:CommandeFournisseur+EtatCommandeFournisseur" />

    demo est le namespace de ma classe model ? cela ne contredit pas le mvvm ?

    Ou alors je peu récupérer CommandeFournisseurViewModel.CommandeFournisseur.Etat ou alors le this.CommandeFournisseur.Etat ?

    Car le ViewModel est celui en cour d'utilisation.

    Autre soucis, je fais ceci sur une ObservableCollection de ViewModel voir ci dessous :
    Code : 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
    <ig:XamGrid x:Name="dataGrid"
                        ItemsSource="{Binding ListeCommandeFournisseurLignes}"> <!-- est de type  ObservableCollection<CommandeFournisseurLigneViewModel> ListeCommandeFournisseurLignes -->
     
            <ig:XamGrid.Columns>
     
       <ig:TemplateColumn Key="CommandeFournisseur.FactureRecu" HeaderText="Fact." IsReadOnly="{Binding Source={StaticResource NonAdministratifEnableConverterKey}}" Width="60">
                        <ig:TemplateColumn.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding CommandeFournisseur.FactureRecu}"/>
                            </DataTemplate>
                        </ig:TemplateColumn.ItemTemplate>
                        <ig:TemplateColumn.EditorTemplate>
                            <DataTemplate>
                                <ComboBox ItemsSource="{Binding Recep}"
                                          SelectedValue="{Binding CommandeFournisseur.FactureRecu}" 
                                          />
                            </DataTemplate>
                        </ig:TemplateColumn.EditorTemplate>
                    </ig:TemplateColumn>
     
                </ig:XamGrid.Columns>
            </ig:XamGrid>

  7. #7
    Membre émérite Avatar de meziantou
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Points : 2 439
    Points
    2 439
    Par défaut
    "demo:" correspond à ton namespace (namespaceDeCommandeFournisseur dans les posts précédant)

    Pourquoi veux-tu absolument utiliser le MVVM pour remplir ta combobox ? La liste des valeurs est fixe, connue à l'avance et ne changera pas. De plus ce bout de code se réutilise pour toutes les énumérations donc tu évites de dupliquer du code.
    Tu peux par contre utiliser le MVVM pour Binder la valeur sélectionnée à ton ViewModel.

  8. #8
    Membre régulier
    Homme Profil pro
    Ingénieur Junior développement logiciels
    Inscrit en
    Mai 2014
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Junior développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 198
    Points : 113
    Points
    113
    Par défaut
    Car je travaille sur une application que je n'ai pas programmée mais que je récupère qui est entièrement en MVVM.

    De plus ma class enum est définit comme mentionné précédemment ; dans mon model.

    Mon ViewModel étant capable de me donner une entiter de type CommandeFournisseur il me paraît logique de pouvoir atteindre le type défini dans ma classe CommandeFournisseur.

    CommandeFournisseur étant mon model je pense que d'utiliser le namespace de celui-ci dans la View n'est pas trop respectueux du MVVM.

    C'est donc la raison de ma question... comment faire ?

    Mon enum ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      public enum Reception
            {
                [Description("Oui")]
                Oui = 0,
                [Description("Non")]
                Non = 1,
                [Description("En Partie")]
                EnPartie = 2
            }

  9. #9
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Bonjour,

    @Lionhart
    Ton enum étant définit dans une classe héritant de ICommand, il fait donc partie de l'espace "VM" de MVVM, il n'y a aucun soucis à utiliser le type tel quel.

    @meziantou
    Ah je ne savais pas que pour les nested type, il fallait utiliser "+" en xaml.
    Et bon article au passage.

  10. #10
    Membre régulier
    Homme Profil pro
    Ingénieur Junior développement logiciels
    Inscrit en
    Mai 2014
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Junior développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 198
    Points : 113
    Points
    113
    Par défaut
    il fait donc partie de l'espace "VM" de MVVM, il n'y a aucun soucis à utiliser le type tel quel.
    Oui est comment le récupérer dans le xaml ?

    De la façon suivante ? :
    il fallait utiliser "+" en xaml.

    De plus je ne sais toujours pas quoi mettre à la place de démo :
    <x:Type TypeName="demo:CommandeFournisseur+EtatCommandeFournisseur" />

    j'ai essayer ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      xmlns:ViewModel="clr-namespace:ViewModel;assembly=ViewModel"
                xmlns:System="clr-namespace:System;assembly=mscorlib"
                >
    <ig:XamGrid.Resources>
                    <ObjectDataProvider MethodName="GetValues" ObjectType="{x:Type System:Enum}" x:Key="EtatCommandeFournisseurProvider">
                        <ObjectDataProvider.MethodParameters>
                            <x:Type TypeName="ViewModel:CommandeFournisseurViewModel+CommandeFournisseur+Reception" />
                        </ObjectDataProvider.MethodParameters>
                    </ObjectDataProvider>
                </ig:XamGrid.Resources>
    j'ai une erreur sur le fait que ViewModel:CommandeFournisseurViewModel+CommandeFournisseur+Reception n'existe pas dans l'espace de noms.


    D'ailleur même en fesant ceci j'ai une erreur sur le x:Type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                  xmlns:Model="clr-namespace:DataAccess"
    <x:Type TypeName="Model:CommandeFournisseur+Reception" />
    Merci pour votre aide

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

Discussions similaires

  1. WPF + mdb >> binding combobox
    Par waspy59 dans le forum Windows Workflow Foundation
    Réponses: 0
    Dernier message: 27/10/2009, 00h31
  2. Binding Combobox Listview
    Par richton95 dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 05/08/2009, 19h32
  3. Enum avec comboBox
    Par punisher999 dans le forum C#
    Réponses: 5
    Dernier message: 04/03/2009, 21h19
  4. probleme binding combobox
    Par warmy dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 13/01/2009, 21h18
  5. VC# Express - Binding ComboBox
    Par Anified dans le forum C#
    Réponses: 11
    Dernier message: 11/10/2007, 16h45

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