如何:绑定到 XDocument、XElement 或 LINQ for XML 查询结果

此示例演示如何使用 XDocument 将 XML 数据绑定到 ItemsControl

示例:

以下 XAML 代码定义了一个 ItemsControl,并在 http://planetsNS XML 命名空间中为Planet类型的数据包含一个数据模板。 占用命名空间的 XML 数据类型必须包含大括号中的命名空间,如果它在可以出现 XAML 标记扩展的位置出现,则必须在命名空间前加上大括号转义序列。 此代码绑定到对应于Element类的XElement动态属性和Attribute方法。 动态属性使 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,并将堆栈面板的数据上下文设置为位于 http://planetsNS XML 命名空间中名为 SolarSystemPlanets 的元素的所有子元素。

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 数据可以使用 ObjectDataProvider 存储为 XAML 资源。 有关完整示例,请参阅 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()

在 XAML 中映射到 ElementAttribute 的动态属性提供了灵活性。 代码还可以绑定到 LINQ for 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

另请参阅