locked
Liaison de données Asynchrones ListBox <-> data Binding RRS feed

  • Question

  • Bonjour,
    Je développe actuellement une application permettant de lire et d'afficher les flux RSS d'un journal local.

    Ma page principale, crée une instance de la classe Flux_RSS, J'appelle ensuite la fonction getflux() pour obtenir mon flux..

        public partial class MainPage : PhoneApplicationPage
        {
            // Constructeur
            WebClient client = new WebClient();
            Flux_RSS flux = new Flux_RSS();
            
            
    
            public MainPage()
            {
                InitializeComponent();
                flux.Url = "http://www.lejournal.com/fluxrss.xml"
                flux.getflux(client);
                liste_articles.ItemsSource = flux.articles;
    }
                
                

    Le flux pouvant être long à charger suivant la vitesse de connexion, la liste des articles n'est remplie qu'après le téléchargement du flux.

        class Flux_RSS
        {
            public String Url {get;set;}
            public String flux { get; set; }
            public DateTime Date { get; set; }
            public List<Article> articles = new List<Article>();
    
            // Fonction permettant de télécharger le flux.
            public void getflux(WebClient client)
            {
                if (this.Url != null)
                {
                    client.DownloadStringCompleted += flux_DownloadStringCompleted;
                    client.DownloadStringAsync(new Uri(this.Url));
                }
            }
            //Fonction s'executant une fois le flux téléchargé
            void flux_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
            {
    
                this.flux = (e.Result);
                this.parse_flux();
            }
            //Fonction permettant de parser le flux.
            public void parse_flux()
            {
                if (this.flux == null) { MessageBox.Show("Erreur, le flux n'a pas été téléchargé"); }
                else 
                {
                    // On prend le flux comme un document xml...
                    //this.articles = new List<Article>();
                    XDocument mydoc = XDocument.Parse(this.flux);
                    //On récupère la date du flux téléchargé... (On pourra ensuite la comparer à celle des données locales)
                    XElement date = (from n in mydoc.Descendants()
                                where n.Name == "lastBuildDate"
                                select n).First();
                    this.Date = DateTime.Parse(date.Value, System.Globalization.CultureInfo.InvariantCulture);
                    //On récupère les noeuds....
                    var nodes = (from n in mydoc.Descendants() 
                                 where n.Name == "item" 
                                 select n);
                    // Pour chaques noeuds on 
                    foreach (XElement item in nodes)
                    {
                        Article article = new Article();
                        // Récupère le titre de l'article
                        XElement title_article = (from n in item.Descendants()
                                          where n.Name == "title"
                                          select n).First();
                        // Récupère la date de l'article.
                        XElement date_article = (from n in item.Descendants()
                                         where n.Name == "pubDate"
                                         select n).First();
                        // Récupère la description de l'article.
                        XElement description_article = (from n in item.Descendants()
                                                        where n.Name == "description"
                                                 select n).First();
                        // Récupère le Contenu de l'article.
                        XElement contenu_article = (from n in item.Descendants()
                                                    where n.Name.LocalName == "encoded"
                                                        select n).First();
                        // Récupère le lien vers l'image de l'article.
                        XElement image_article = (from n in item.Descendants()
                                                    where n.Name == "enclosure"
                                                        select n).First();
                        String Urlimage=image_article.Attribute("url").Value;
    
                        article.Titre = title_article.Value;
                        article.Date = DateTime.Parse(date_article.Value, System.Globalization.CultureInfo.InvariantCulture);
                        article.Contenu = contenu_article.Value;
                        article.UriImage = Urlimage;
                        (this.articles).Add(article);
                    }
                }
    
            }
    
    
        }

    Le problème me semble venir de la synchronisation des fonctions : la liste des articles etant vide tant que la fonction parseflux n'est pas terminée. En revanche, étant novice, je ne vois pas de solution.

    Merci pour votre aide et bonne année !


    mercredi 1 janvier 2014 16:11

Réponses

  • Bonjour,

    Dans ce cas essayez d'écrire votre code à l'aide des mots clé async/await ce qui simplifera votre code et permettra de mieux comprendre ce qui ne fonctionne pas :

    http://msdn.microsoft.com/fr-fr/vstudio/jj573641.aspx

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    • Proposé comme réponse Aurel Bera lundi 6 janvier 2014 08:49
    • Marqué comme réponse Aurel Bera mercredi 8 janvier 2014 07:21
    vendredi 3 janvier 2014 02:04

Toutes les réponses

  • Bonjour,

    Pouvez-vous nous confirmer que vous êtes en train de développer une application pour Windows Phone ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    jeudi 2 janvier 2014 09:33
  • Oui tout à fait ! Pour windows phone 8 et je teste sur un device Nokia Lumia 1020 directement.
    jeudi 2 janvier 2014 10:32
  • Bonjour,

    Dans ce cas essayez d'écrire votre code à l'aide des mots clé async/await ce qui simplifera votre code et permettra de mieux comprendre ce qui ne fonctionne pas :

    http://msdn.microsoft.com/fr-fr/vstudio/jj573641.aspx

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    • Proposé comme réponse Aurel Bera lundi 6 janvier 2014 08:49
    • Marqué comme réponse Aurel Bera mercredi 8 janvier 2014 07:21
    vendredi 3 janvier 2014 02:04