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
    Points : 3 304
    Points
    3 304
    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.

  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
    Points : 39 753
    Points
    39 753
    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
    Points : 3 304
    Points
    3 304
    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 ?)

  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
    Points : 39 753
    Points
    39 753
    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
    Points : 3 304
    Points
    3 304
    Par défaut
    Effectivement cela fonctionne comme cela... Merci bien.

+ 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