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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 chevronné
    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
    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 confirmé
    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
    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 confirmé
    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
    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 Expert Avatar de meziantou
    Homme Profil pro
    autre
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : autre
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    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 confirmé
    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
    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>

+ 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