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.