none
ListBox binding RRS feed

  • Question

  • Salut à tous,

    J'ai un petit soucis avec une ma listBox et le Binding :

    J'ai deux textBlock dans ma listBox avec un champ "Titre" et un champ "Description".

    <ListBox  ItemsSource="{Binding Items}" Height="646" Margin="0,6,0,0" x:Name="nouvellesListBox" VerticalAlignment="Top" HorizontalAlignment="Left" Width="450">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <StackPanel Width="370" Margin="0,0,0,10">
                                        <TextBlock Name="listBoxTitle" Text="{Binding Title}" FontSize="28" TextWrapping="Wrap" Style="{StaticResource PhoneTextAccentStyle}" />
                                        <TextBlock Text="{Binding Description}" TextWrapping="Wrap"  Style="{StaticResource PhoneTextNormalStyle}" Height="Auto" DataContext="{Binding}" />
                                    </StackPanel>
                                </StackPanel>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>

    Dans mon code c#, je parse une page html, ensuite je récupère dans deux tableaux le "titre" et la "description" de chaque élément de la page.
    Enfin, je veux insérer dans un objet RSSitem le "titre" et la "description" récupérés dans mes 2 tableaux précédents.
    Le problème est qu'avec une boucle from x in monTableau1 from x in monTableau2 j'ai des items dupliqués alors que je voudrais assigné les valeurs qu'une seule fois.

    J'ai tenté avec une boucle for() {} mais je n'y arrive pas.

            void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
            {
                // Si une erreur s'est produite pendant le téléchargement, on ne renvoit rien
                if (e.Error != null) return;
    
                HtmlDocument doc = new HtmlDocument();
                doc.LoadHtml(e.Result);
    
                
                string[] description= doc.DocumentNode.Descendants("p").Where(x => (string)x.GetAttributeValue("class", "") == "contenu").Select(y => y.InnerText).ToArray();
                string[] titre = doc.DocumentNode.Descendants("h3").Where(x => (string)x.GetAttributeValue("class", "") == "titre").Select(y => y.InnerText).ToArray();
    
                //Remplissage de la listBox
                nouvellesListBox.ItemsSource = from x in titre from y in description
                                               //On cree un nouvel élément RSSitem
                                               select new RSSitem
                                               {
                                                  Title = x,
                                                  Description = y
                                                  
                      
                             };
                //Ce que j'ai essayé
                //for (int i = 0; i < titre.Length; i++)
                //{
                //    RSSitem rs = new RSSitem
                //    {
                //        Title = titre[i],
                //        Description = description[i]
                //    };
                //    nouvellesListBox.ItemsSource = rs;
                //}


    jeudi 15 mars 2012 19:17

Réponses

  • Bonsoir,

    La deuxième version (celle avec le for) me parait la plus addaptée en effet. Il y a simplement une petite erreur au moment de l'assignation des éléments.

    Au lieu de faire:

    nouvellesListBox.ItemSource = rs;

    Il faut simplement faire:

    nouvellesListBox.Items.Add(rs);

    Ca devrait fonctionner. (pense juste à faire un nouvellesListBox.Items.Clear() avant la boucle pour ne pas dupliquer les élements)

    Matthieu

    jeudi 15 mars 2012 20:12
  • Ah! Je viens tout juste de m'en rendre compte!!
    Merci beaucoup pour la réponse rapide.
    Je reviendrai sûrement vers vous pour d'autres questions (bêtes). Je développe ma première application =)


    Le code correcte est 

    List<RSSitem> list = new List<RSSitem>();
                for (int i = 0; i < titre.Length; i++)
                {
                    RSSitem rs = new RSSitem();
                    rs.Title = titre[i];
                    rs.Description = description[i];
                    list.Add(rs);
                }
                nouvellesListBox.ItemsSource = list;
            }



    jeudi 15 mars 2012 20:51

Toutes les réponses

  • Bonsoir,

    La deuxième version (celle avec le for) me parait la plus addaptée en effet. Il y a simplement une petite erreur au moment de l'assignation des éléments.

    Au lieu de faire:

    nouvellesListBox.ItemSource = rs;

    Il faut simplement faire:

    nouvellesListBox.Items.Add(rs);

    Ca devrait fonctionner. (pense juste à faire un nouvellesListBox.Items.Clear() avant la boucle pour ne pas dupliquer les élements)

    Matthieu

    jeudi 15 mars 2012 20:12
  • Ah! Je viens tout juste de m'en rendre compte!!
    Merci beaucoup pour la réponse rapide.
    Je reviendrai sûrement vers vous pour d'autres questions (bêtes). Je développe ma première application =)


    Le code correcte est 

    List<RSSitem> list = new List<RSSitem>();
                for (int i = 0; i < titre.Length; i++)
                {
                    RSSitem rs = new RSSitem();
                    rs.Title = titre[i];
                    rs.Description = description[i];
                    list.Add(rs);
                }
                nouvellesListBox.ItemsSource = list;
            }



    jeudi 15 mars 2012 20:51