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

Silverlight Discussion :

SL3 Binding entre Listbox et requête Linq


Sujet :

Silverlight

  1. #1
    Membre chevronné

    Profil pro
    Chef de Projet / Développeur
    Inscrit en
    Juin 2002
    Messages
    598
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de Projet / Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2002
    Messages : 598
    Points : 2 020
    Points
    2 020
    Par défaut SL3 Binding entre Listbox et requête Linq
    Bonjour,

    Je désire dans une Listbox afficher certains des éléments d'un fichier XML chargé via un WebClient et sur lequel je fait une requête Linq.
    Mais je n'arrive pas à faire un bind satisfaisant.

    Fichier XML
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version="1.0" encoding="utf-8" ?>
    <themes>
      <theme>
        <libelle>Démarrage</libelle>
        <descriptif>introduction</descriptif>
        <auteur>Alain</auteur>
      </theme>
      <theme>
        <libelle>Leçon 1</libelle>
        <descriptif>Mise en route</descriptif>
        <auteur>Pierre</auteur>
      </theme>
    </themes>
    XAML
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <ListBox x:Name="lstThemes" Height="300">
       <ListBox.ItemTemplate>
          <DataTemplate>
             <StackPanel Orientation="Vertical">
                <TextBlock Text="{Binding libelle}"/>
                <TextBlock Text="{Binding auteur}"/>
             </StackPanel>
          </DataTemplate>
       </ListBox.ItemTemplate>
    </ListBox>
    C# (j'utilise des variables inutiles pour pouvoir voir le contenu en mode debuggage)

    Je passe par un ToList, parce que j'ai vue pal mal d'exemple le faire, mais sans savoir si c'était réellement utile (j'ai bien entendu tenté des assignation directe de mon résultat sans cette transformation).


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void DlXmlThemeCompleted(object sender, DownloadStringCompletedEventArgs e)
            {
                string sThemes = e.Result;
                XElement xml = XElement.Parse(sThemes);
                var themes = from t in xml.Descendants("theme")
                             select new 
                             {
                                 libelle = t.Element("libelle").Value,
                                 auteur =  t.Element("auteur").Value
                             };
                var maliste = themes.ToList();
                lstThemes.ItemsSource = maliste;              
            }
    Ca ne fonctionne pas.
    En passant la souris, je vois que j'ai 2 items, mais vide de tout contenu.

    J'ai supprimer le Listbox.ItemTemplate pour réduire la définition de la ListBox à sa plus simple expression et tenté d'assigner DisplayMemberPath sans succès.

    Pensant que le pb venait du type anonyme j'ai essayer des choses du genre

    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
    class Theme
    {
            public string libelle { get; set; }
            public string auteur { get; set; }
    }
    
    void DlXmlThemeCompleted(object sender, DownloadStringCompletedEventArgs e)
            {
                string sThemes = e.Result;
                XElement xml = XElement.Parse(sThemes);
                var themes = from t in xml.Descendants("theme")
                             select new Theme()  
                             {
                                 libelle = t.Element("libelle").Value,
                                 auteur =  t.Element("auteur").Value
                             };
                var maliste = themes.ToList();
                lstThemes.ItemsSource = maliste; 
                lstThemes.DisplayMemberPath = "libelle";            
            }
    Sans plus de succès.
    themes contient bien des "MonEspaceDeNom.Theme" correctement renseignés, mais rien ne s'affiche dans la liste.

    Mon seul succès a été :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void DlXmlThemeCompleted(object sender, DownloadStringCompletedEventArgs e)
            {
                string sThemes = e.Result;
                XElement xml = XElement.Parse(sThemes);
                var themes = from t in xml.Descendants("theme")
                             select  t.Element("libelle").Value ;
                lstThemes.ItemsSource = theme; 
            }
    Si quelqu'un peu me donner un coup de main ... se serait super sympa.
    --
    vanquish

  2. #2
    Membre habitué Avatar de wil4linux
    Inscrit en
    Février 2005
    Messages
    205
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Février 2005
    Messages : 205
    Points : 174
    Points
    174
    Par défaut
    Au lieu de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var maliste = themes.ToList();
    lstThemes.ItemsSource = maliste;
    Essai peut être de typé ta liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    List<Theme> themeList = new List<Theme>();
    themeList  = themes.ToList();
    lstThemes.ItemsSource = themeList;

  3. #3
    Membre chevronné

    Profil pro
    Chef de Projet / Développeur
    Inscrit en
    Juin 2002
    Messages
    598
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de Projet / Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2002
    Messages : 598
    Points : 2 020
    Points
    2 020
    Par défaut
    Merci wal4linux, cela ne fonctionne pas mais m'a permis de voir que mon pb est encore plus simple que cela.

    J'ejecte Linq et XML pour faire un tout bête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                List<Theme> maliste = new List<Theme>();
                maliste.Add(new Theme() { libelle = "Test Un", auteur = "Dupont" });
                maliste.Add(new Theme() { libelle = "Test Deux", auteur = "Durand" });
                lstThemes.ItemsSource = maliste;
                //lstThemes.DisplayMemberPath = "libelle";
            }
    Et j'ai exactement le même problème (que ce soit avec un ItemTemplate ou sans) : j'ai bien 2 items dans ma Listbox, mais les item restent vides.

    Un truc m'échappe dans le fonctionnement du système.
    --
    vanquish

  4. #4
    Membre chevronné

    Profil pro
    Chef de Projet / Développeur
    Inscrit en
    Juin 2002
    Messages
    598
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de Projet / Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2002
    Messages : 598
    Points : 2 020
    Points
    2 020
    Par défaut
    Citation Envoyé par vanquish Voir le message
    Un truc m'échappe dans le fonctionnement du système.
    et je l'ai trouvé ... j'en reviens pas d'être aussi bête.

    Il faut bien passer par un type, le bind sur un type anonyme retourné par Linq ne semble pas pouvoir fonctionner.

    Mon erreur est tout simplement de ne pas avoir mis public devant ma déclaration. (faut m'excuser, je viens de Delphi où les type sont systématiquement public).

    C'est quand même étonnant de n'avoir aucun message d'erreur et surtout aucune exception.

    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
    public class Theme
    {
            public string libelle { get; set; }
            public string auteur { get; set; }
    }
    
    void DlXmlThemeCompleted(object sender, DownloadStringCompletedEventArgs e)
            {
                string sThemes = e.Result;
                XElement xml = XElement.Parse(sThemes);
                var themes = from t in xml.Descendants("theme")
                             select new Theme
                             {
                                 libelle = t.Element("libelle").Value,
                                 auteur =  t.Element("auteur").Value
                             };
                lstThemes.ItemsSource = maliste; 
            }
    fonctionnent parfaitement.
    Inutile de passer par un ToList() comme je l'ai vu faire dans plein d'exemples.

    Cordialement
    --
    vanquish

  5. #5
    Membre habitué Avatar de wil4linux
    Inscrit en
    Février 2005
    Messages
    205
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Février 2005
    Messages : 205
    Points : 174
    Points
    174
    Par défaut
    Le truc trop bête... Ça nous servira de leçon comme ça

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Points : 674
    Points
    674
    Par défaut
    Citation Envoyé par wil4linux Voir le message
    Au lieu de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var maliste = themes.ToList();
    lstThemes.ItemsSource = maliste;
    Essai peut être de typé ta liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    List<Theme> themeList = new List<Theme>();
    themeList  = themes.ToList();
    lstThemes.ItemsSource = themeList;
    Attention, l'utilisation de "var" ne veut pas dire que ta liste n'est pas typée.... c'est juste un raccourci d'écriture!! (Ne pas confondre avec VBA etc...)




    Citation Envoyé par vanquish Voir le message
    Il faut bien passer par un type, le bind sur un type anonyme retourné par Linq ne semble pas pouvoir fonctionner.
    Exactement: un type anonyme est uniquement dispo dans la portée courante. Une fois que tu sors de ta fonction, le type "n'existe plus". C'est pour ça entre autres qu'on ne peut pas les passer en paramètres.


    Citation Envoyé par vanquish Voir le message
    Mon erreur est tout simplement de ne pas avoir mis public devant ma déclaration. (faut m'excuser, je viens de Delphi où les type sont systématiquement public).

    C'est quand même étonnant de n'avoir aucun message d'erreur et surtout aucune exception.
    Les control graphiques n'ont pas à connaitre le type réel derrière (ils n'ont pas de référence vers ta classe que tu as définie). Pour la liste, elle "récupère" simplement les données dans un IEnumerable (cf ItemsSource) et par réflection ils vont chercher la donnée à afficher (cf DisplayMemberPath qui est de type string), et si DisplaymemberPath n'est pas définie, ils utilisent ToString() qui est défini dans la classe object de base.

    Christophe

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/11/2011, 14h29
  2. Binding HS avec une requête LINQ retournant plusieurs tables
    Par abbepierre94 dans le forum Silverlight
    Réponses: 4
    Dernier message: 01/02/2011, 11h19
  3. Réponses: 2
    Dernier message: 26/05/2010, 16h29
  4. [WPF] Problème de binding entre une SortedList et une ListBox
    Par JuTs dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 10/12/2007, 13h20
  5. Drag and Drop entre listbox
    Par zwoke dans le forum C++Builder
    Réponses: 2
    Dernier message: 05/07/2004, 14h10

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