WPF中绑定XML数据源本实例最终执行效果:
左边是一个ListBox,用来显示用户的主要信息;右边是4个TextBox,用来显示左边ListBox中被选中用户的详细信息。
本实例中,存在一个XML格式的数据源,XML文件格式如下:
<?xml version="1.0"?>
<Company> <Employee> <ID>372401</ID> <Name>徐栋</Name> <Age>26</Age> <Sex>男</Sex> </Employee> ……
</Company>
接下来,使用WPF的XAML语言来创建界面,访问该数据源。
对数据源的调用我放在<Window.Resources>中。通过<XmlDataProvider>标记,实现对XML数据源的调用,x:Key是资源的引用的ID,Source是XML资源文件路径,XPath指出XML文件内部数据存放的路径。
在<Window.Resources>还有另外两个标记,分别是DataTemplate和Style。
DataTemplate是ListBox的ListBoxItem中显示的数据内容,在DataTemplate中放置一个TextBlock用来,将TextBlock的Text属性与XML数据源中的Name标记绑定,也就说用来显示XML文件中的Name。
Style是WPF的样式。在这里,我们指定了本Window中,所有的TextBlock都采用Style中定义的样式。
整个Source中代码如下:
<Window.Resources>
<XmlDataProvider x:Key="employeeSource" Source="Employees.xml" XPath="/Company/*"/> <DataTemplate x:Key="showName"> <TextBlock Text="{Binding XPath=Name}" /> </DataTemplate> <Style TargetType="{x:Type TextBlock}" > <Setter Property="FontStyle" Value="Italic" /> <Setter Property="FontFamily" Value="Trebuchet MS" /> <Setter Property="FontSize" Value="12" /> </Style> </Window.Resources> 资源文件已经定义号,然后在Windows中放置Grid布局控件来规划窗口。在Grid上分别放置用来显示名称的ListBox和用来显示相信用户信息的TextBlock。在ListBox和TextBlock中显示的数据,来自上面定义的资源,这里通过绑定功能实现。
首先绑定ListBox。
首先将ListBox的ItemSource属性与资源中的XmlDataProvider绑定,说明ListBox中Item的数据源。
ItemsSource="{Binding Source={StaticResource employeeSource}}"
然后将ListBox的ItemTemplate属性与资源中的DataTemplate 绑定,说明ListBox中Item的数据显示内容。
ItemTemplate="{StaticResource showName}"
最后,非常重要的一点,我们需要将ListBox与数据源设置为同步,这样数据源中的游标才会随着选中ListBox中不同Item而移用。
IsSynchronizedWithCurrentItem="True"
这个ListBox的代码如下:
<ListBox Grid.Column="0" Grid.Row="0" Margin="5,5,5,5" ItemsSource="{Binding Source={StaticResource employeeSource}}" ItemTemplate="{StaticResource showName}" IsSynchronizedWithCurrentItem="True"/>
通过以上设置,ListBox与数据源绑定结束,已经在ListBox中列出XML中的Name数据,接下来需要使用TextBlock显示用户详细信息。
实现这个功能,我们需要定义四个TextBlock分别显示XML中的ID、Name、Age 和Sex 四项数据,然后将这个四个TextBlock的Text分别绑定XML中四项数据。这四个TextBlock实现方式基本相同,以显示ID的TextBlock为例,说明TextBlock的绑定方式。
TextBlock的数据源绑定ListBox不同,是采用DataContext来绑定。TextBlock的Text属性与ID绑定。实现代码如下:
<TextBlock>
ID: <TextBlock Margin="10,0,0,0" DataContext="{Binding Source={StaticResource employeeSource}}" Text="{Binding XPath=ID}"/> </TextBlock> 至此,一个最简单的WPF与XML绑定的程序就已经完成,可以实现文章开头处描写的功能。
同时,WPF还能够与SQL数据源绑定,自定义的对象绑定,可见WPF的数据绑定功能非常强大;在这个XML绑定的程序,没有一行C#的代码,通过对XAML这种声明式语言的修改,就能实现以前实现非常复杂的数据绑定功能,也体现了WPF简单之处。(徐栋)
本文附带Demo的全部代码如下:
XML文件(Employees.xml):
<?xml version="1.0"?>
<Company> <Employee> <ID>372401</ID> <Name>徐栋</Name> <Age>26</Age> <Sex>男</Sex> </Employee> <Employee> <ID>151806</ID> <Name>吕布</Name> <Age>36</Age> <Sex>男</Sex> </Employee> <Employee> <ID>108208</ID> <Name>貂蝉</Name> <Age>19</Age> <Sex>女</Sex> </Employee> <Employee> <ID>051806</ID> <Name>关羽</Name> <Age>36</Age> <Sex>男</Sex> </Employee> </Company> XAML文件(Windows1.XAML):
<Window x:Class="WPFDataBindingXML.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="WPFDataBindingXML" Height="300" Width="300" > <Window.Resources> <XmlDataProvider x:Key="employeeSource" Source="Employees.xml" XPath="/Company/*"/> <DataTemplate x:Key="showName"> <TextBlock Text="{Binding XPath=Name}" /> </DataTemplate> <Style TargetType="{x:Type TextBlock}" > <Setter Property="FontStyle" Value="Italic" /> <Setter Property="FontFamily" Value="Trebuchet MS" /> <Setter Property="FontSize" Value="12" /> </Style> </Window.Resources> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition/> </Grid.RowDefinitions> <ListBox Grid.Column="0" Grid.Row="0" Margin="5,5,5,5" ItemsSource="{Binding Source={StaticResource employeeSource}}" ItemTemplate="{StaticResource showName}" IsSynchronizedWithCurrentItem="True"/> <StackPanel Margin="5,5,5,5" Grid.Column="1" Grid.Row="0">
<TextBlock> ID: <TextBlock Margin="10,0,0,0" DataContext="{Binding Source={StaticResource employeeSource}}" Text="{Binding XPath=ID}"/> </TextBlock> <TextBlock> Name: <TextBlock Margin="10,0,0,0" DataContext="{Binding Source={StaticResource employeeSource}}" Text="{Binding XPath=Name}"/> </TextBlock> <TextBlock> Age: <TextBlock Margin="10,0,0,0" DataContext="{Binding Source={StaticResource employeeSource}}" Text="{Binding XPath=Age}"/> </TextBlock> <TextBlock> Sex: <TextBlock Margin="10,0,0,0" DataContext="{Binding Source={StaticResource employeeSource}}" Text="{Binding XPath=Sex}"/> </TextBlock> </StackPanel> </Grid> </Window> |
|