Cómo: Enlazar a los resultados de una consulta LINQ for XML, XDocument o XElement

En este ejemplo se muestra cómo enlazar datos XML a ItemsControl mediante XDocument.

Ejemplo

El código XAML siguiente define un elemento ItemsControl e incluye una plantilla de datos para los datos de tipo Planet en el espacio de nombres XML http://planetsNS. Un tipo de datos XML que ocupa un espacio de nombres debe incluir el espacio de nombres entre llaves y, si aparece donde podría aparecer una extensión de marcado XAML, debe preceder al espacio de nombres con una secuencia de escape de llaves. Este código se enlaza a propiedades dinámicas que corresponden a los métodos Element y Attribute de la clase XElement. Las propiedades dinámicas permiten a XAML enlazar a las propiedades dinámicas que comparten los nombres de los métodos. Para obtener más información, consulte Propiedades dinámicas de LINQ to XML. Tenga en cuenta cómo la declaración de espacio de nombres predeterminada para XML no se aplica a los nombres de atributo.

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

El código de C# siguiente llama a Load y establece el contexto de datos del panel StackPanel en todos los subelementos del elemento denominado SolarSystemPlanets en el espacio de nombres XML http://planetsNS.

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

Los datos XML se pueden guardar como un recurso XAML mediante ObjectDataProvider. Para obtener un ejemplo completo, consulte Código de origen de L2DBForm.xaml. En el ejemplo siguiente se muestra cómo el código puede establecer el contexto de datos en un recurso de objetos.

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

Las propiedades dinámicas que se asignan a Element y Attribute proporcionan flexibilidad dentro de XAML. El código también puede enlazar a los resultados de una consulta LINQ to XML. Este ejemplo enlaza a los resultados de la consulta ordenados por un valor de elemento.

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

Vea también