Gewusst wie: Binden an XDocument, XElement oder LINQ für XML-Abfrageergebnisse
Dieses Beispiel veranschaulicht, wie Sie XML-Daten in ItemsControl mit XDocument binden.
Beispiel
Der folgende XAML-Code definiert ein ItemsControl und schließt eine Datenvorlage für Daten vom Typ Planet
in den http://planetsNS
-XML-Namespace 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 bindet an dynamische Eigenschaften, die den Element- und Attribute-Methoden 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 als XAML-Ressource gespeichert werden, indem Sie ObjectDataProvider nutzen. 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 = (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 und Attribute zugeordnet werden, sorgen für Flexibilität in XAML. Der Code kann auch an die Ergebnisse einer LINQ to 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()
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
Weitere Informationen
.NET Desktop feedback