Udostępnij za pośrednictwem


Jak powiązać z dokumentem X, elementem X lub LINQ dla wyników zapytań XML

W tym przykładzie pokazano, jak powiązać dane XML z elementem ItemsControl przy użyciu polecenia XDocument.

Przykład

Poniższy kod XAML definiuje ItemsControl element i zawiera szablon danych dla danych typu Planet w http://planetsNS przestrzeni nazw XML. Typ danych XML, który zajmuje przestrzeń nazw, musi zawierać przestrzeń nazw w nawiasach klamrowych, a jeśli okaże się, gdzie może pojawić się rozszerzenie znaczników XAML, musi poprzedzać przestrzeń nazw sekwencją ucieczki nawiasu klamrowego. Ten kod wiąże się z właściwościami dynamicznymi odpowiadającymi Element metodom XElement i klasy .Attribute Właściwości dynamiczne umożliwiają kodowi XAML powiązanie z właściwościami dynamicznymi, które współdzielą nazwy metod. Aby dowiedzieć się więcej, zobacz WŁAŚCIWOŚCI dynamiczne LINQ to XML. Zwróć uwagę, że domyślna deklaracja przestrzeni nazw XML nie ma zastosowania do nazw atrybutów.

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

Następujące wywołania Load kodu języka C# i ustawia kontekst danych panelu stosu na wszystkie podelementy elementu o nazwie SolarSystemPlanets w http://planetsNS przestrzeni nazw XML.

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

Dane XML mogą być przechowywane jako zasób XAML przy użyciu polecenia ObjectDataProvider. Pełny przykład można znaleźć w kodzie źródłowym L2DBForm.xaml. Poniższy przykład pokazuje, jak kod może ustawić kontekst danych na zasób obiektu.

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

Właściwości dynamiczne mapujące na Element i Attribute zapewniają elastyczność w języku XAML. Kod może być również powiązany z wynikami zapytania LINQ for XML. Ten przykład wiąże się z wynikami zapytania uporządkowanymi według wartości elementu.

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

Zobacz też