Freigeben über


Vorgehensweise: Binden an XDocument-, XElement- oder LINQ für XML-Abfrageergebnisse

In diesem Beispiel wird veranschaulicht, wie XML-Daten mithilfe von ItemsControl an eine XDocument gebunden werden.

Beispiel

Der folgende XAML-Code definiert eine ItemsControl und enthält eine Datenvorlage für Daten des Typs Planet im http://planetsNS XML-Namensraum. Ein XML-Datentyp, der einen Namespace belegt, muss diesen in geschweifte Klammern setzen, und wenn er dort erscheint, wo auch eine XAML-Markuperweiterung erscheinen könnte, muss er den Namespace mit einem Fluchtzeichen in geschweiften Klammern beginnen. Dieser Code bindet an dynamische Eigenschaften, die den Methoden Element und Attribute der Klasse XElement entsprechen. Mit dynamischen Eigenschaften kann XAML an dynamische Eigenschaften gebunden werden, die die Namen von Methoden gemeinsam verwenden. Weitere Informationen finden Sie unter LINQ to XML dynamic properties. Beachten Sie, dass die Standardnamespacedeklaration für den XML-Code nicht auf Attributnamen angewendet wird.

<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>

Der folgende C#-Code ruft Load auf und legt den Datenkontext des Stapelpanels auf alle Unterelemente des Elements fest, das im SolarSystemPlanets XML-Namespace als http://planetsNS benannt ist.

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()

XML-Daten können mithilfe von ObjectDataProvider als XAML-Ressource gespeichert werden. Ein vollständiges Beispiel finden Sie im Quellcode "L2DBForm.xaml". Das folgende Beispiel zeigt, wie Code den Datenkontext auf eine Objektressource festlegen kann.

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()

Die dynamischen Eigenschaften, die Element xaml zugeordnet sind und Attribute Flexibilität bieten. Ihr Code kann auch an die Ergebnisse einer LINQ für XML-Abfrage gebunden werden. In diesem Beispiel werden abfrageergebnisse gebunden, die nach einem Elementwert sortiert sind.

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

Siehe auch