2010-11-10 4 views
0

J'essaie d'accéder à un fichier XML en ligne et d'afficher son contenu dans une application Windows Phone 7 Silverlight. Je n'obtiens aucune erreur, mais lorsqu'il est émulé aucun contenu n'est affiché à partir du fichier XML. D'après ce que j'ai recueilli en ligne, j'appelle simplement les choses dans le désordre. Je ne suis pas sûr de quoi.Application Silverlight WP7 ne contenant pas de contenu XML

MainPage.xaml.cs:

namespace TwitterMix 
{ 
public partial class MainPage : PhoneApplicationPage 
{ 
    // Constructor 
    public MainPage() 
    { 
     InitializeComponent(); 
    } 


    private void GetRoster() 
    { 
     WebClient rstr = new WebClient(); 

     rstr.DownloadStringCompleted += new DownloadStringCompletedEventHandler(roster_DownloadStringCompleted); 
     rstr.DownloadStringAsync(new Uri("http://www.danfess.com/data.xml")); 
    } 

    void roster_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
     if (e.Error != null) 
      return; 

     XElement xmlPersons = XElement.Parse(e.Result); 

     var list = new List<RosterViewModel>(); 

     foreach (XElement person in xmlPersons.Elements("person")) 
     { 
      var name = person.Element("name").Value; 
      var age = person.Element("age").Value; 


      list.Add(new RosterViewModel 
      { 
       Name = name, 
       Age = age, 
      }); 
     } 

     rosterList.ItemsSource = list; 
    } 


    public class RosterViewModel 
    { 
     public string Name { get; set; } 
     public string Age { get; set; } 
    } 


} 
} 

MainPage.xaml:

<Grid x:Name="ContentPanel" Grid.Row="1"> 
     <ListBox HorizontalAlignment="Left" Name="rosterList" VerticalAlignment="Top" Width="468" Height="600"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal" Height="132"> 
         <StackPanel Width="370"> 
          <TextBlock Text="{Binding Name}" Foreground="White" FontSize="28" /> 
          <TextBlock Text="{Binding Age}" TextWrapping="Wrap" FontSize="24" Foreground="White" /> 
         </StackPanel> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </Grid> 

Et enfin le contenu du fichier XML:

<?xml version="1.0" encoding="utf-8" ?> 

<roster> 

<person> 
<name>Blake</name> 
<age>25</age> 
</person> 

<person> 
<name>Jane</name> 
<age>29</age> 
</person> 

<person> 
<name>Bryce</name> 
<age>29</age> 
</person> 

<person> 
<name>Colin</name> 
<age>29</age> 
</person> 

</roster> 

Des conseils ou suggestions sont, bien sûr, grandement apprécié. Merci à tous pour votre aide!

+0

X-Ref: http://stackoverflow.com/questions/4138694/connect-to-xml-file-at-web-address-for-wp7-app –

Répondre

1

Je pense que votre problème est que le rappel de DownloadStringCompleted est effectué sur un thread autre que le thread d'interface utilisateur. Listbox ou bien ignore tout ou lance une exception qui est avalée par le thread appelant.

Vous devez basculer vers le thread d'interface utilisateur avant d'affecter la propriété itemsource.

Dispatcher.Current.BeginInvoke((Action)(()=>rosterList.ItemsSource = list)); 

va de même pour l'affectation à une propriété qui est liée aux données à un élément d'interface utilisateur

+0

Cela a tout résolu! Je ne peux pas vous dire à quel point j'étais excité quand ça a vraiment marché, haha. Certes, j'ai mordu un peu plus que je pouvais mâcher la chauve-souris et fait une erreur idiote. Merci encore pour votre aide! – Dan

0

Si vous comprenez comment cela fonctionne dans un ordre différent, je serais très intéressé de le voir. J'ai dû ajouter beaucoup de frais généraux pour le faire fonctionner. La façon dont je l'ai fait fonctionner était ma classe de données (votre rosterviewmodel) héritée de INotifyPropertyChanged et tout ce que cela implique. Lors de l'initialisation de mon objet de données, j'ai défini un gestionnaire sur l'événement propertychanged de mon objet de données. Ensuite, dans le gestionnaire, vous devez définir le DataContext de votre stackpanel sur l'objet qui vient d'être modifié.

0

Avez-vous vérifié la liste est en cours de remplissage? Définissez un point d'arrêt avant de lier à la liste des listes et d'inspecter la liste.Compte.

Vous pouvez simplement charger le xml comme

XDocument xmlPersons = XDocument.Load(e.Result); 

    var list = from query in xmlPersons.Descendants("person") 
        select new RosterViewModel 
        { 
         Name = (string)query.Element("name"), 
         Age = (int)query.Element("age") 
        }; 


    rosterList.ItemsSource = list; 

(le code modifié manuellement pour utiliser vos noms var - non testé).

Questions connexes