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

In diesem Beispiel wird veranschaulicht, wie XML-Daten mit XDocument an ein ItemsControl gebunden werden.

Beispiel

Der folgende XAML-Code definiert ein ItemsControl und schließt eine Datenvorlage für Daten vom Typ Planet in den XML-Namespace http://planetsNS ein. Ein XML-Datentyp, der in einem Namespace definiert ist, muss den Namespace in geschweiften Klammern enthalten. An einer Position, an der XAML-Markuperweiterungen auftreten können, muss dem Namespace eine Escapesequenz mit geschweiften Klammern vorangestellt werden. Dieser Code wird an dynamische Eigenschaften gebunden, die der Element-Methode und der Attribute-Methode der XElement-Klasse entsprechen. Dynamische Eigenschaften ermöglichen die Bindung von XAML an dynamische Eigenschaften, die die Namen von Methoden gemeinsam verwenden. Weitere Informationen dazu finden Sie unter Dynamische Eigenschaften in LINQ to XML. Beachten Sie, dass die XML-Standardnamespacedeklaration nicht für Attributnamen gilt.

<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 StackPanel-Datenkontext auf alle Unterelemente des Elements mit dem Namen SolarSystemPlanets im XML-Namespace http://planetsNS fest.

            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 mit ObjectDataProvider als XAML-Ressource gespeichert werden. Ein vollständiges Beispiel finden Sie unter Quellcode in der Datei 'L2DBForm.xaml'. Im folgenden Beispiel wird gezeigt, wie der Datenkontext in Code auf eine Objektressource festgelegt werden kann.

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

Die dynamischen Eigenschaften, die Element und Attribute zugeordnet sind, stellen Flexibilität innerhalb von XAML bereit. Der Code kann auch an die Ergebnisse einer LINQ für XML-Abfrage gebunden werden. In diesem Beispiel erfolgt die Bindung an die nach einem Elementwert sortierten Abfrageergebnisse.

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

Siehe auch

Konzepte

Übersicht über Bindungsquellen

Übersicht über die WPF-Datenbindung mit LINQ to XML

Beispiel für die WPF-Datenbindung mit LINQ to XML

Dynamische Eigenschaften in LINQ to XML