WPF:数据绑定--Xml数据源
XmlDataSource Xml数据源
实现效果:
- 如何使用 XmlDataProvider 绑定到 XML 数据。
- 查询或筛选xml特定数据在ListBox中展示
关键词:
- <Inventory xmlns="">
- XPath="[@Stock='out'] | [@Number>=8 or @Number=3]"
数据源xml
数据是作为 Resources 部分内的 XML 数据岛 直接嵌入的。 XML 数据岛必须包装在 <x:XData> 标记中,并始终具有一个单一根节点,在本示例中根节点为 Inventory。
<XmlDataProvider x:Key="InventoryData" XPath="Inventory/Books"> <x:XData> <Inventory xmlns=""> <Books> <Book ISBN="0-7356-0562-9" Stock="in" Number="9"> <Title>XML in Action</Title> <Summary>XML Web Technology</Summary> </Book> <Book ISBN="0-7356-1370-2" Stock="in" Number="8"> <Title>Programming Microsoft Windows With C#</Title> <Summary>C# Programming using the .NET Framework</Summary> </Book> <Book ISBN="0-7356-1288-9" Stock="out" Number="7">
ListBox绑定xml数据及模板:
ListBox 将显示下列项。 这些项为 Books 下所有元素的 Title,其中 Stock 值为“ out”, Number 值为 3 或者大于或等于 8。
<ListBox Width="400" Height="300" Background="Honeydew"> <ListBox.ItemsSource> <Binding Source="{StaticResource InventoryData}" XPath="*[@Stock='out'] | *[@Number>=8 or @Number=3]"/> </ListBox.ItemsSource> <!--Alternatively, you can do the following. --> <!--<ListBox Width="400" Height="300" Background="Honeydew" ItemsSource="{Binding Source={StaticResource InventoryData}, XPath=*[@Stock\=\'out\'] | *[@Number>\=8 or @Number\=3]}">--> <ListBox.ItemTemplate> <DataTemplate> <TextBlock FontSize="12" Foreground="Red"> <TextBlock.Text> <Binding XPath="Title"/> </TextBlock.Text> </TextBlock> </DataTemplate> </ListBox.ItemTemplate> </ListBox>
当运行 XPath 查询时,它将返回 XmlNode 或 XmlNode 列表。 XmlNode 是一个CLR对象,这意味着可以使用 Path 属性绑定到CLR属性。
扩展:
- XML 数据的根节点具有一个将 XML 命名空间设置为空字符串的 xmlns 特性。 将 XPath 查询应用到 XAML 页中内联的数据岛时,需要此属性。 在此内联情况下,XAML 以及数据岛会继承 System.Windows 命名空间。 因此,您需要将命名空间设置为空白,以防止 XPath 查询被 System.Windows 命名空间限定而误导查询。
WPF 中的 XPath 属性是由 XmlNode.SelectNodes 方法处理的。 您可以修改 XPath 查询以获取不同的结果。
- XPath="Book[1]" 将返回第一个 Book 元素(“XML in Action”)。 请注意 XPath 索引从 1 而不是从 0 开始。
- XPath="Book[@*]" 将返回带有任意特性的所有 Book 元素。
- XPath="Book[last()-1]" 将返回第二个至最后一个 Book 元素.
- XPath="*[position()>3]" 将返回除前 3 个元素之外的所有 Book 元素。
在某些应用程序中,将 XML 作为 XAML 页的源内的数据岛嵌入可能很不方便,因为在编译时必须知道该数据的确切内容。 因此,还支持从外部 XML 文件获取该数据,如下面的示例所示:
<XmlDataProvider x:Key="BookData" Source="data\bookdata.xml" XPath="Books"/>
<XmlDataProvider x:Key="BookData" Source="http://MyUrl" XPath="Books"/>
XmlnsBind
要声明 URI 与前缀之间的映射,请创建一个 XmlNamespaceMapping 类,并将该类添加到用作绑定的 XmlNamespaceManager 的 XmlNamespaceMappingCollection 对象。
关键词:
- XmlNamespaceManager
- XmlNamespaceMapping
如果您的 XML 数据具有以下 XML 命名空间定义:
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1...;>
您可以使用 XmlNamespaceMapping 元素将命名空间映射到 Prefix,
<XmlNamespaceMappingCollection x:Key="Mapping"> <XmlNamespaceMapping Uri="http://purl.org/dc/elements/1.1/" Prefix="dc" /> </XmlNamespaceMappingCollection> <XmlDataProvider Source="http://msdn.microsoft.com/subscriptions/rss.xml" XmlNamespaceManager="{StaticResource Mapping}" XPath="rss/channel/item" x:Key="Provider"/> <TextBlock Grid.Row="1" Text="{Binding XPath=dc:date}" />
扩展:
- 请注意,您指定的 Prefix 不一定要与 XML 源中使用的前缀相匹配;这样,如果 XML 源中的前缀更改,您的映射仍可以起作用。
- 在此特定示例中,XML 数据来自于一个 Web 服务,但 XmlNamespaceMapping 元素还处理内联 XML 或嵌入式文件中的 XML 数据。