Практическое руководство. Привязка к 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 = 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();

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

            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;

См. также

Основные понятия

Общие сведения об источниках привязки

Общие сведения о связывании с данными в WPF с помощью LINQ to XML

Пример связывания с данными в WPF с помощью LINQ to XML

Динамические свойства LINQ to XML