Condividi tramite


Procedura: Eseguire l'associazione a risultati di query XDocument, XElement o LINQ for XML

In questo esempio viene illustrato come associare dati XML a un ItemsControl usando XDocument.

Esempio

Il codice XAML seguente definisce un ItemsControl e include un modello di dati per i dati di tipo Planet nello spazio dei nomi XML http://planetsNS. Un tipo di dati XML che appartiene a uno spazio dei nomi deve includere tra parentesi graffe lo spazio dei nomi e, se viene visualizzato dove potrebbe apparire un'estensione di markup XAML, deve precedere lo spazio dei nomi con una sequenza di escape con parentesi graffe. Questo codice viene associato a proprietà dinamiche che corrispondono ai metodi Element e Attribute della classe XElement. Le proprietà dinamiche consentono a XAML di associare proprietà dinamiche che condividono i nomi dei metodi. Per altre informazioni, vedere proprietà dinamiche LINQ to XML. Si noti che la dichiarazione dello spazio dei nomi predefinita per il codice XML non si applica ai nomi degli attributi.

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

Il codice C# seguente chiama Load e imposta il contesto dei dati del pannello dello stack su tutti i sottoelementi dell'elemento denominato SolarSystemPlanets nello spazio dei nomi 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()

I dati XML possono essere archiviati come risorsa XAML usando ObjectDataProvider. Per un esempio completo, vedere il codice sorgente L2DBForm.xaml . L'esempio seguente illustra come il codice può impostare il contesto dati su una risorsa oggetto.

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

Le proprietà dinamiche mappate a Element e Attribute offrono flessibilità all'interno di XAML. Il codice può anche essere associato ai risultati di una query LINQ for XML. Questo esempio viene associato ai risultati della query ordinati in base al valore di un 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

Vedere anche