Практическое руководство. Привязка к XDocument, XElement или LINQ для результатов запросов XML
В этом примере показано, как привязать данные XML ItemsControl с помощью XDocument.
Пример
Следующий код XAML определяет ItemsControl и включает в себя шаблон данных для данных типа Planet
в http://planetsNS
пространство имен XML. Тип данных 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
в http://planetsNS
пространство имен XML.
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();
Динамические свойства, которые сопоставляются с 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;