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 un elemento 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 enlaza a las 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, vea 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 de pila 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 pueden almacenarse como recurso XAML mediante ObjectDataProvider. Para obtener un ejemplo completo, vea 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 = 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();

Las propiedades dinámicas que se asignan a Element y Attribute proporcionan flexibilidad dentro de XAML. Su código también puede enlazar a los resultados de una consulta LINQ for 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()
                                 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;

Vea también

Conceptos

Información general sobre orígenes de enlaces

Información general sobre el enlace de datos de WPF con LINQ to XML

Ejemplo de enlace de datos de WPF con LINQ to XML

Propiedades dinámicas de LINQ to XML