Dela via


Anvisningar: Binda till XDocument, XElement eller LINQ för XML-frågeresultat

Det här exemplet visar hur du binder XML-data till en ItemsControl med hjälp av XDocument.

Exempel

Följande XAML-kod definierar en ItemsControl och innehåller en datamall för data av typen Planet i http://planetsNS XML-namnområde. XML-datatypen som upptar ett namnområde måste inkludera namnområdet i klammerparenteser, och om det visas där ett XAML-markup-tillägg kan visas, ska det föregås av en escape-sekvens för klammerparenteser. Den här koden binder till dynamiska egenskaper som motsvarar metoderna Element och Attribute i klassen XElement. Med dynamiska egenskaper kan XAML binda till dynamiska egenskaper som delar namnen på metoderna. Mer information finns i dynamiska egenskaper i LINQ till XML. Observera hur standarddeklarationen för namnområdet för XML inte gäller för attributnamn.

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

Följande C#-kod anropar Load och anger stackpanelens datakontext till alla underelement i elementet med namnet SolarSystemPlanets i http://planetsNS XML-namnområdet.

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-data kan lagras som en XAML-resurs med hjälp av ObjectDataProvider. Ett fullständigt exempel finns i L2DBForm.xaml-källkod. Följande exempel visar hur kod kan ange datakontexten till en objektresurs.

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

De dynamiska egenskaper som mappas till Element och Attribute ger flexibilitet inom XAML. Koden kan också binda till resultatet av en LINQ för XML-fråga. Det här exemplet binder till frågeresultat ordnade efter ett elementvärde.

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

Se även