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 :

ComboBox ItemTemplate Error lors de la sélection


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Février 2015
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Février 2015
    Messages : 66
    Points : 63
    Points
    63
    Par défaut ComboBox ItemTemplate Error lors de la sélection
    Bonjour à tous,

    J'ai créé un ComboBox de la manière suivante :
    Code xaml : 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
    <StackPanel Margin="5,0,5,0">
                        <TextBlock Text="Ajoutez un ingrédient" HorizontalAlignment="Center"/>
                        <ComboBox ItemsSource="{Binding IngredientListeSource}" 
                                    SelectedItem="{Binding SelectedIngredient}"
                                    IsEditable="True" IsTextSearchCaseSensitive="False">
                            <ComboBox.ItemTemplate>
                                <DataTemplate>
                                    <StackPanel Orientation="Horizontal">
                                        <TextBlock Text="{Binding Name}"/>
                                        <TextBlock Text=" ("/>
                                        <TextBlock Text="{Binding IDmesure}"/>
                                        <TextBlock Text=")"/>
                                    </StackPanel>
                                </DataTemplate>
                            </ComboBox.ItemTemplate>
                        </ComboBox>
                    </StackPanel>

    L'ItemsSource est bien chargé (aucun soucis).
    Le point bloquant vient lors de la sélection d'un "item" (comme vous pouvez le voir sur l'image ci-dessous)
    Nom : HomeManager_PbComboBox.PNG
Affichages : 136
Taille : 37,0 Ko

    La propriété SelectedIngredient du ViewModel est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    private Ingredient _selectedIngredient;
            public Ingredient SelectedIngredient
            {
                get
                {
                    return _selectedIngredient;
                }
                set
                {
                    _selectedIngredient = value;
                    OnPropertyChanged("SelectedIngredient");
                }
            }

    L'itemsSource du ComboBox est bindé sur une ObservableCollection qui récupère ses données via la fonction :
    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
    private List<Ingredient> getIngredientListeSource()
            {
                List<Ingredient> itemListe = new List<Ingredient>();
     
                foreach (var item in IngredientProvider.selectAll())
                {
                    itemListe.Add(new Ingredient 
                    {
                        Name = item.Name,
                        IDmesure = item.IDmesure,
                    });
                }
     
                return itemListe;
            }
    Je ne trouve pas d'où peut venir le problème.
    Je cale pour ce soir

    Auriez-vous une petite idée ?

  2. #2
    Membre du Club
    Homme Profil pro
    Alternant
    Inscrit en
    Octobre 2019
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 48
    Points : 66
    Points
    66
    Par défaut
    Quel erreur t'es retourné ? Que contient ta variable _selectedIngredient au moment du bug ?

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Février 2015
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Février 2015
    Messages : 66
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par iR3SH Voir le message
    Quel erreur t'es retourné ? Que contient ta variable _selectedIngredient au moment du bug ?
    Aucune erreur n'est retournée dans la console.

    Nom : HomeManager_PbComboBox_2.PNG
Affichages : 114
Taille : 20,3 Ko

    _selectedIngredient est de type "Ingredient" (car apres j'ajoute la donnée dans un listView (qui fonctionne bien malgré le bug dans l'affichage du combobox).
    La propriété SelectedItem du comboBox doit normalement être de type "string" (j'ai vu ça en fouillant Google )

    En fait ça retourne bien ce qui est demandé.. mais pas ce que j'attendais :p . Ce que je n'arrive pas à faire c'est comment récupérer le bon format (si je peux m'exprimer ainsi) :/

  4. #4
    Membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Février 2015
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Février 2015
    Messages : 66
    Points : 63
    Points
    63
    Par défaut
    La liste du comboBox est une liste d'objet et non une liste de string.

    La propriété "SelectedItem" tente de convertir un objet (typé "Ingredient") en string. C'est donc normal qu'il m'affiche "HomeManager.Models.Ingredient".

    La compréhension du problème avance

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Février 2015
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Février 2015
    Messages : 66
    Points : 63
    Points
    63
    Par défaut
    Bonjour,

    Je reviens sur ce sujet.
    J'ai réussi à trouver une solution.

    Pour réussir à afficher correctement la sélection dans le ComboBox, j'ai du overrider la propriété ToString() de la classe "Ingredient" de cette manière : (les autres codes n'ont pas changé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #region Properties
    public string IDingredient { get; set; }
    public string Name { get; set; }
    public string IDmesure { get; set; }
    #endregion Properties
     
    #region Public Method
    public override string ToString()
      {
        return $"{this.Name} ({this.IDmesure})";
      }
    #endregion Public Method
    Cette méthode fonctionne bien. Seulement, si par la suite vous avez besoin d'utiliser la propriété ToString() sur un object "Ingredient" il faudra penser qu'elle aura été overridée
    De plus, la propriété "IsEditable" seule, du fichier .xaml, ne gère pas si la chaîne de caractère insérée correspond à un des items de la liste du comboBox.
    Pour se protéger vous devrez utiliser la propriété "IsReadOnly" comme l'indique la doc Microsoft.

    Ce n'est pas la méthode que j'ai retenu.
    En effet, la propriété "IsEditable" est trop contraignante, car pour outre passer le problème nous devons overrider la propriété ToString().
    Pour éviter ça, il faut supprimer la propriété "IsEditable", et la remplacer par la propriété " TextSearch.TextPath = "Name" ".
    "TextSearch.TextPath" prend en paramètre (ici "Name") le nom de la propriété que vous souhaitez afficher.

    Voici donc le code avec modification :
    Code xaml : 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
     
    ComboBox ItemsSource="{Binding IngredientListeSource}"  
                    SelectedItem ="{Binding SelectedIngredient}"
                    TextSearch.TextPath = "Name">
     
       <ComboBox.ItemTemplate>
          <DataTemplate>
             <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Name}"/>
                <TextBlock Text=" ("/>
                <TextBlock Text="{Binding IDmesure}"/>
                <TextBlock Text=")"/>
             </StackPanel>
          </DataTemplate>
       </ComboBox.ItemTemplate>
    </ComboBox>

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

Discussions similaires

  1. I/O Error lors de la copie d'un fichier
    Par Rodrigue dans le forum Windows XP
    Réponses: 7
    Dernier message: 04/08/2006, 10h35
  2. [VB.NET]Error lors du pilotage d'excel
    Par krfa1 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 01/05/2006, 12h58
  3. [SQL Server 2000] error lors d'un select
    Par ardi dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/04/2006, 08h39
  4. [LG]Runtime Error lors d'une recherche dans un fichier
    Par Fraynor dans le forum Langage
    Réponses: 2
    Dernier message: 15/03/2005, 22h51
  5. Redirection automatique lors d'une sélection dans un Select
    Par MiJack dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 21/12/2004, 18h09

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