2010-02-04 5 views
7

J'ai cherché et essayé différentes solutions mais jusqu'à présent aucun d'entre eux ne résout mon problème. J'utilise le DataGrid intégré de WPF dans Visual Studio 2010/.NET4 pour afficher des données à partir d'un document XML stocké en tant que XDocument.Comment lier xml au DataGrid WPF correctement?

Mon code fonctionne bien, et j'ai vérifié que XDocument est présent et correct. Le DataGrid n'affiche cependant aucune donnée.

Le XML ressemble à ceci (simplifié pour plus de clarté):

<data> 
    <track> 
    <id>211</id> 
    <name>Track Name</name> 
    <duration>156</duration> 
    <artist_id>13</artist_id> 
    <artist_name>Artist Name</artist_name> 
    <album_id>29</album_id> 
    <album_name>Album Name</album_name> 
    </track> 
... 
</data> 

Mon XAML ressemble à ceci:

<DataGrid x:Name="LibraryView" Grid.Row="1" 
       DataContext="{Binding Path=TrackList}" ItemsSource="{Binding XPath=/data/track}"> 
    <DataGridTextColumn Header="Title" Binding="{Binding XPath=name}"/> 
    <DataGridTextColumn Header="Artist" Binding="{Binding XPath=artist_name}"/> 
    <DataGridTextColumn Header="Album" Binding="{Binding XPath=album_name}"/> 
    <DataGridTextColumn Header="Length" Binding="{Binding XPath=duration}"/> 
</DataGrid> 

Le C# qu'il sauvegarde attribue juste un nouveau XDocument (téléchargé à partir d'un service Web) à la propriété TrackList (qui implémente INotifyPropertyChanged). Aucun traitement supplémentaire n'est effectué à ce sujet. J'ai déjà essayé d'utiliser XLinq pour lier un résultat de requête qui ne fonctionnait pas non plus (même problème), donc j'ai pensé essayer l'approche XPath pour éviter d'écrire une instruction Linq potentiellement buggée, et essayer pour trouver le problème.

Je n'ai plus d'idées pour afficher correctement le DataGrid. Ma compréhension de la façon dont cela est censé fonctionner est clairement absente, alors j'apprécierais grandement toute aide offerte. Editer: Il est intéressant de noter que j'ai une certaine flexibilité avec le format de données d'entrée, car je télécharge moi-même du XML brut. Je vais essayer quelques-unes des suggestions et voir ce que je peux faire pour travailler.

Répondre

9

je XLinq et a bien fonctionné, en utilisant un XElement au lieu d'un XDocument:

XElement TrackList = XElement.Load("List.xml"); 
LibraryView.DataContext = TrackList; 

Xaml:

<DataGrid x:Name="LibraryView" ItemsSource="{Binding Path=Elements[track]}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Artist" Binding="{Binding Path=Element[artist_name].Value}"/> 
     <DataGridTextColumn Header="Album" Binding="{Binding Path=Element[album_name].Value}"/> 
     <DataGridTextColumn Header="Length" Binding="{Binding Path=Element[duration].Value}"/> 
    </DataGrid.Columns> 
</DataGrid> 
+0

Cela déclenche une InvalidOperationException avec le message suivant: "La collection Items doit être vide avant d'utiliser ItemsSource, ce qui se produit lors de l'assignation à DataContext ou dans le gestionnaire d'événements pour PropertyChanged, donc empêche l'implémentation" Edit: No it doesn ' t, j'ai oublié d'ajouter autour de mes définitions de colonne – IanGilham

+0

L'exception a été mon erreur.Cela fonctionne bien – IanGilham

+0

Oh man, le débogage xaml peut être odieux. – Natxo

1

La liaison XPath n'est pertinente que si vous liez un objet XmlNode (par exemple, vous utilisez XmlDataProvider). Voir here. XPath ne fonctionne pas avec les classes XDocument. La seule façon de lier aux propriétés d'un XDocument est la syntaxe Path normale, qui n'est pas compatible avec XML. Le meilleur moyen est soit d'utiliser XmlDataSource, soit de convertir votre document XML via XDocument en POCO. C'est assez simple en utilisant LINQ:

XDocument doc = XDocument.Load(xmlFile); 

      var tracks = from track in doc.Descendants("data") 
        select new Track() 
           { 
            Name= track.Element("name").Value,  
            Duration= track.Element("duration").Value,  
            etc ... 
           }; 
LibraryView.ItemsSource = tracks; 
+0

Mais comment voulez-vous charger un document XML entier pour l'édition dans un DataGrid. Je veux dire, comment mappez-vous certains éléments XML et leurs attributs aux colonnes DataGrid et modifiez-les uniquement? –

Questions connexes