Поделиться через


Практическое руководство. Привязка к результатам XDocument, XElement или LINQ для XML-запросов

В этом примере показано, как привязать XML-данные к ItemsControl с помощью XDocument.

Пример

Следующий код XAML определяет ItemsControl и включает шаблон данных для данных типа Planet в пространстве имен XML http://planetsNS. Тип данных XML, который занимает пространство имен, должен заключать его в фигурные скобки, и если он находится в месте, где может быть расширение разметки XAML, он должен предварять пространство имен escape-последовательностью фигурных скобок. Этот код привязывается к динамическим свойствам, соответствующим методам Element и Attribute класса XElement. Динамические свойства позволяют XAML привязаться к динамическим свойствам, которые совместно используют имена методов. Дополнительные сведения см. в LINQ to XML динамических свойств. Обратите внимание, что объявление пространства имен по умолчанию для XML не применяется к именам атрибутов.

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

Следующий код C# вызывает Load и задает контекст данных панели стека для всех подэлементов элемента с именем SolarSystemPlanets в пространстве имен 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()

XML-данные можно хранить в виде ресурса XAML с помощью ObjectDataProvider. Полный пример приведен в исходном коде L2DBForm.xaml. В следующем примере показано, как код может задать контекст данных ресурсу объекта.

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

Динамические свойства, сопоставленные с Element и Attribute обеспечивают гибкость в XAML. Код также может связываться с результатами запроса LINQ для XML. В этом примере выполняется привязка к результатам запроса, упорядоченным по значению элемента.

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

См. также