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 :

WPF Binding sur une listbox


Sujet :

C#

  1. #1
    Membre Expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Par défaut WPF Binding sur une listbox
    Bonjour,

    Je suis en train de remettre mes connaissances à jour en étudiant le WPF.

    J'ai un petit soucis :

    J'ai un dataset contenant une table Collections (provenant d'un fichier XML ou d'une base de données Access).

    Cette table contient 2 champs :

    - Id (long)
    - Libelle (varchar)

    Je voudrais utiliser cette source pour alimenté une listbox WPF mais sans créer le binding au niveau XAML.

    J'ai essayé de 2 manières :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    m_Data.ReadXml("F:\\_DeveloppementPerso\\_data\\data _Collection.dat");
     
    Binding MyBinding = new Binding("LIBELLE");
    MyBinding.Source = m_Data.Tables[0];
    this.listBox1.SetBinding(ListBox.ItemsSourceProperty, MyBinding);
    Ce qui me donne dans ma liste 7 items qui correspond bien au nombre de Rows dans ma table mais sans le texte (Libellé) affiché.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    this.listBox1.DataContext = m_Data;
    this.listBox1.ItemsSource = m_Data.Tables[0].Rows;
    this.listBox1.DisplayMemberPath = m_Data.Tables[0].Columns[1].ColumnName;
    Qui me donne le même résultat.

    Si j'utilise le XAML pour créer ma liaison cela fonctionne.
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

  2. #2
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Binding MyBinding = new Binding("LIBELLE");
    MyBinding.Source = m_Data.Tables[0];
    this.listBox1.SetBinding(ListBox.ItemsSourceProperty, MyBinding);
    Ce code crée un binding sur la colonne LIBELLE de la table... c'est sur la table elle-même qu'il faut binder. Et d'ailleurs tu n'as pas besoin de binding, tu peux affecter directement la table à la propriété ItemsSource :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    this.listBox1.ItemsSource = m_Data.Table[0];
    this.listBox1.DisplayMemberPath = "LIBELLE";
    Citation Envoyé par binou76 Voir le message
    Si j'utilise le XAML pour créer ma liaison cela fonctionne.
    Et tu mets quoi dans ton code XAML ?

  3. #3
    Membre Expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Par défaut
    Merci pour la réponse rapide

    Citation Envoyé par tomlev Voir le message
    Et tu mets quoi dans ton code XAML ?
    Donc pour le code Behind:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
       m_Data = new DataSet();
       m_Data.ReadXml("i:\\_DeveloppementPerso\\_data\\data _Collection.xml");
       this.listBox1.DataContext = m_Data;
    }
    Et dans la partie XAML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ...         
    <ListBox
                Height="403" 
                HorizontalAlignment="Left" 
                Name="listBox1" 
                VerticalAlignment="Top" 
                Width="205" 
                ItemsSource="{Binding Tables[0]}"
                DisplayMemberPath="Libelle"
    />
    ...
    Comme ceci cela marche mais en passant par le XAML.

    Par contre si je reteste ta solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
            m_Data = new DataSet();
            m_Data.ReadXml("i:\\_DeveloppementPerso\\_data\\data_Collection.dat");
     
            this.listBox1.ItemsSource = m_Data.Tables[0].Rows;
            this.listBox1.DisplayMemberPath =  "Libelle";
    }
    Cela ne fonctionne pas, toujours 7 lignes devenue sélectionnable dans mon listbox mais sans le libellé affiché.

    Et si je met la ligne suivante sans le ".Rows" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.listBox1.ItemsSource = m_Data.Tables[0];
    J'obtiens le message d'erreur suivant :

    Impossible de convertir implicitement le type 'System.Data.DataTable' en 'System.Collections.IEnumerable'. Une conversion explicite existe (un cast est-il manquant ?)
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

  4. #4
    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
    Ah oui c'est vrai, j'avais oublié que DataTable n'implémentait pas IEnumerable... Il faut effectivement utiliser un binding dans ce cas. Comme ça ça devrait marcher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            Binding b = new Binding("Tables[0]");
            this.listBox1.SetBinding(ItemsControl.ItemsSourceProperty, b);
            this.listBox1.DisplayMemberPath =  "Libelle";
            this.listBox1.DataContext = m_Data;

  5. #5
    Membre Expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Par défaut
    Effectivement cela fonctionne comme cela... Merci bien.
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

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

Discussions similaires

  1. [Débutant] WPF : Binding sur une méthode
    Par TWEESTY dans le forum C#
    Réponses: 2
    Dernier message: 16/12/2012, 11h02
  2. Réponses: 3
    Dernier message: 07/03/2009, 12h56
  3. Réponses: 5
    Dernier message: 30/01/2008, 09h18
  4. drag and drop sur une listBox?
    Par Mickey.jet dans le forum Delphi
    Réponses: 3
    Dernier message: 30/09/2006, 10h27
  5. dégradé sur une listbox avec 1/2 couleurs
    Par avogadro dans le forum Composants VCL
    Réponses: 8
    Dernier message: 05/05/2006, 18h21

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