WPF绑定XML数据源

WPF在绑定XML时会有一些麻烦,经常是不显示列表内容,但是内容项却是存在,这说明配置XAML信息有误,见图例效果,绑定XML数据源,且能实现分组。

1.XML数据源,其中xmlns是命名空间,后面代码中会将其改成前缀名sb使用
 

Code:
  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <Students xmlns="http://sonny.com">  
  3.     <Student StudentName="李金香" Sex="女" ClassID="4"/>  
  4.     <Student StudentName="张亮" Sex="男" ClassID="7"/>  
  5.     <Student StudentName="张利华" Sex="女" ClassID="9"/>  
  6.     <Student StudentName="李頔飞" Sex="男" ClassID="10"/>  
  7.     <Student StudentName="侯潇楠" Sex="女" ClassID="11"/>  
  8.     <Student StudentName="杨超" Sex="男" ClassID="1"/>  
  9.     <Student StudentName="陈磊" Sex="男" ClassID="2"/>  
  10.     <Student StudentName="张涛" Sex="男" ClassID="3"/>  
  11.     <Student StudentName="周立华" Sex="女" ClassID="4"/>  
  12.     <Student StudentName="陈荔" Sex="女" ClassID="5"/>  
  13.     <Student StudentName="赵欣环" Sex="男" ClassID="7"/>  
  14.     <Student StudentName="黄博" Sex="男" ClassID="9"/>  
  15.     <Student StudentName="苏三东" Sex="男" ClassID="10"/>  
  16.     <Student StudentName="吴佳嵘" Sex="男" ClassID="11"/>  
  17.     <Student StudentName="王立岩" Sex="女" ClassID="1"/>  
  18.     <Student StudentName="季刚" Sex="女" ClassID="2"/>  
  19.     <Student StudentName="李文达" Sex="男" ClassID="3"/>  
  20.     <Student StudentName="高爱文" Sex="男" ClassID="4"/>  
  21.     <Student StudentName="杨过" Sex="男" ClassID="9"/>  
  22.     <Student StudentName="黄蓉" Sex="女" ClassID="3"/>  
  23.     <Student StudentName="小新" Sex="男" ClassID="6"/>  
  24. </Students>  
Code:
  1. <Window x:Class="Demo14_BindingFromXML.MainWindow"  
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
  3.         xmlns:sys="clr-namespace:System;assembly=mscorlib"  
  4.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
  5.         xmlns:xm="clr-namespace:System.Xml;assembly=System.Xml"  
  6.         xmlns:local="clr-namespace:Demo14_BindingFromXML"  
  7.         Title="MainWindow" Height="333" Width="496">  
  8.     <Window.Resources>  
  9.         <XmlDataProvider x:Key="stuList" Source="Students.xml"  
  10.                          XPath="/sb:Students/sb:Student">  
  11.             <XmlDataProvider.XmlNamespaceManager>  
  12.                 <XmlNamespaceMappingCollection>  
  13.                     <XmlNamespaceMapping Uri="http://sonny.com" Prefix="sb" />  
  14.                 </XmlNamespaceMappingCollection>  
  15.             </XmlDataProvider.XmlNamespaceManager>  
  16.         </XmlDataProvider>  
  17.         <DataTemplate x:Key="showStudentTemplate">  
  18.             <TextBlock>  
  19.                 <TextBlock Text="{Binding XPath=@StudentName}" />(<TextBlock Text="{Binding XPath=@Sex}" />:<TextBlock Text="{Binding XPath=@ClassID}" />)   
  20.             </TextBlock>  
  21.         </DataTemplate>  
  22.     </Window.Resources>  
  23.     <Grid Margin="5" DataContext="{StaticResource stuList}">  
  24.         <Grid.Resources>  
  25.             <Style TargetType="TextBlock">  
  26.                 <Setter Property="Margin" Value="5" />  
  27.                 <Setter Property="VerticalAlignment" Value="Center" />  
  28.             </Style>  
  29.             <Style TargetType="TextBox">  
  30.                 <Setter Property="Margin" Value="5" />  
  31.                 <Setter Property="VerticalAlignment" Value="Center" />  
  32.             </Style>  
  33.             <Style TargetType="ListBox">  
  34.                 <Setter Property="Margin" Value="5" />  
  35.             </Style>  
  36.             <Style TargetType="Button">  
  37.                 <Setter Property="Margin" Value="5" />  
  38.                 <Setter Property="Width" Value="65" />  
  39.                 <Setter Property="Height" Value="25" />  
  40.                 <Setter Property="HorizontalAlignment" Value="Left" />  
  41.             </Style>  
  42.         </Grid.Resources>  
  43.         <Grid.RowDefinitions>  
  44.             <RowDefinition />  
  45.             <RowDefinition Height="Auto"  />  
  46.             <RowDefinition Height="Auto"  />  
  47.             <RowDefinition Height="Auto" />  
  48.             <RowDefinition Height="Auto" />  
  49.         </Grid.RowDefinitions>  
  50.         <Grid.ColumnDefinitions>  
  51.             <ColumnDefinition Width="80" />  
  52.             <ColumnDefinition />  
  53.         </Grid.ColumnDefinitions>  
  54.         <TextBlock Text="List:" Grid.Row="0" Grid.Column="0"/>  
  55.         <TextBlock Text="Name:" Grid.Row="1" Grid.Column="0"/>  
  56.         <TextBlock Text="Gender:" Grid.Row="2" Grid.Column="0"/>  
  57.         <TextBlock Text="Class:" Grid.Row="3" Grid.Column="0"/>  
  58.         <ListBox Grid.Row="0" Grid.Column="1" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True"    
  59.                  ItemTemplate="{StaticResource showStudentTemplate}">  
  60.             <ListBox.GroupStyle>  
  61.                 <GroupStyle>  
  62.                     <GroupStyle.HeaderTemplate>  
  63.                         <DataTemplate>  
  64.                             <TextBlock Background="Black" Foreground="White" FontWeight="Bold">  
  65.                                 <TextBlock Text="{Binding XPath=@ClassID}" />  
  66.                                 (<TextBlock Text="{Binding ItemCount}" />)   
  67.                             </TextBlock>  
  68.                         </DataTemplate>  
  69.                     </GroupStyle.HeaderTemplate>  
  70.                 </GroupStyle>  
  71.             </ListBox.GroupStyle>  
  72.         </ListBox>  
  73.         <TextBox Grid.Row="1" Grid.Column="1" Name="txtName" Text="{Binding XPath=@StudentName}" />  
  74.         <TextBox Grid.Row="2" Grid.Column="1" Name="txtGender" Text="{Binding XPath=@Sex}" />  
  75.         <TextBox Grid.Row="3" Grid.Column="1" Name="txtClass" Text="{Binding XPath=@ClassID}" />  
  76.         <StackPanel Orientation="Horizontal" Grid.Row="4" Grid.Column="1">  
  77.             <Button   Content="Group" Name="cmdGroup" Click="cmdGroup_Click" />  
  78.         </StackPanel>  
  79.   
  80.     </Grid>  
  81. </Window>  
Code:
  1. using System.Windows;   
  2. using System.Windows.Data;   
  3. using System.ComponentModel;   
  4.   
  5. namespace Demo14_BindingFromXML {   
  6.     /// <summary>   
  7.     /// MainWindow.xaml 的交互逻辑   
  8.     /// </summary>   
  9.     public partial class MainWindow : Window {   
  10.         public MainWindow() {   
  11.             InitializeComponent();   
  12.         }   
  13.   
  14.         private void cmdGroup_Click(object sender, RoutedEventArgs e) {   
  15.             ICollectionView view = GetDefaultView();   
  16.             if (view.GroupDescriptions.Count==0) {   
  17.                 view.GroupDescriptions.Add(new PropertyGroupDescription("@ClassID"));   
  18.             } else {   
  19.                 view.GroupDescriptions.Clear();   
  20.             }   
  21.         }   
  22.   
  23.         private ICollectionView GetDefaultView() {   
  24.             DataSourceProvider provider = (DataSourceProvider)this.FindResource("stuList");   
  25.             var collection = provider.Data;   
  26.             ICollectionView view = CollectionViewSource.GetDefaultView(collection);   
  27.             return view;   
  28.         }   
  29.     }   
  30. }   

注意:
1.DataTemplate定义显示方式,不再使用DataType属性,且绑定使用XPath,绑定的xml节点为xml的属性,故采用@属性名
2.在后置代码中获取数据源时

DataSourceProvider provider = (DataSourceProvider)this.FindResource("stuList");
var collection = provider.Data;

collection是MS.Internal.Data.XmlDataCollection,在PresentationFramework.dll程序集中,但是该命名空间下却无法看到该命名空间,该类声明是internal class XmlDataCollection,只能在它的命名空间中使用,所以外部无法使用。故我采用了var定义。

源代码下载:
http://u.163.com/1zTgkhv9
提取码:ojt73ata

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值