分享

WPF中绑定XML数据源

 高高 2007-05-16

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>

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多