Comment : effectuer une liaison avec XDocument, XElement ou LINQ pour des résultats de requête XML

Cet exemple montre comment lier des données XML à une ItemsControl utilisation XDocument.

Exemple

Le code XAML suivant définit un ItemsControl modèle de données et inclut un modèle de données pour les données de type Planet dans l’espace http://planetsNS de noms XML. Un type de données XML qui occupe un espace de noms doit inclure l’espace de noms entre accolades, et s’il s’affiche là où une extension de balisage XAML pourrait apparaître, il doit précéder l’espace de noms avec une séquence d’échappement d’accolades. Ce code est lié aux propriétés dynamiques qui correspondent aux méthodes et Attribute aux Element méthodes de la XElement classe. Les propriétés dynamiques permettent à XAML de se lier aux propriétés dynamiques qui partagent les noms des méthodes. Pour en savoir plus, consultez les propriétés dynamiques LINQ to XML. Notez comment la déclaration d’espace de noms par défaut pour XML ne s’applique pas aux noms d’attribut.

<StackPanel Name="stacky">
  <StackPanel.Resources>
    <DataTemplate DataType="{}{http://planetsNS}Planet" >
      <StackPanel Orientation="Horizontal">
        <TextBlock Width="100" Text="{Binding Path=Element[{http://planetsNS}DiameterKM].Value}" />
        <TextBlock Width="100" Text="{Binding Path=Attribute[Name].Value}" />
        <TextBlock Text="{Binding Path=Element[{http://planetsNS}Details].Value}" /> 
      </StackPanel>
    </DataTemplate>
  </StackPanel.Resources>
  <ItemsControl 
    ItemsSource="{Binding }" >
  </ItemsControl>
</StackPanel>

Le code C# suivant appelle Load et définit le contexte de données du panneau de pile sur tous les sous-éléments de l’élément nommé SolarSystemPlanets dans l’espace http://planetsNS de noms XML.

planetsDoc = XDocument.Load("../../Planets.xml");
stacky.DataContext = planetsDoc.Element("{http://planetsNS}SolarSystemPlanets").Elements();
planetsDoc = XDocument.Load("../../Planets.xml")
stacky.DataContext = planetsDoc.Element("{http://planetsNS}SolarSystemPlanets").Elements()

Les données XML peuvent être stockées en tant que ressource XAML à l’aide ObjectDataProviderde . Pour obtenir un exemple complet, consultez le code source L2DBForm.xaml. L’exemple suivant montre comment le code peut définir le contexte de données sur une ressource d’objet.

planetsDoc = (XDocument)((ObjectDataProvider)Resources["justTwoPlanets"]).Data;
stacky.DataContext = planetsDoc.Element("{http://planetsNS}SolarSystemPlanets").Elements();
planetsDoc = CType((CType(Resources("justTwoPlanets"), ObjectDataProvider)).Data, XDocument)
stacky.DataContext = planetsDoc.Element("{http://planetsNS}SolarSystemPlanets").Elements()

Propriétés dynamiques qui mappent et ElementAttribute offrent une flexibilité au sein du code XAML. Votre code peut également être lié aux résultats d’une requête LINQ to XML. Cet exemple se lie aux résultats de la requête triés par une valeur d’élément.

stacky.DataContext =
from c in planetsDoc.Element("{http://planetsNS}SolarSystemPlanets").Elements()
orderby Int32.Parse(c.Element("{http://planetsNS}DiameterKM").Value)
select c;
stacky.DataContext = From c In planetsDoc.Element("{http://planetsNS}SolarSystemPlanets").Elements()
                     Order By Int32.Parse(c.Element("{http://planetsNS}DiameterKM").Value)
                     Select c

Voir aussi