WPF绑定XML数据源

本文介绍如何在WPF中绑定XML数据源,并通过XAML实现学生信息列表的分组展示。文章提供了完整的XAML代码示例及C#后台代码,展示了如何设置数据模板、样式及分组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

Code:
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <Studentsxmlns="http://sonny.com">
  3. <StudentStudentName="李金香"Sex="女"ClassID="4"/>
  4. <StudentStudentName="张亮"Sex="男"ClassID="7"/>
  5. <StudentStudentName="张利华"Sex="女"ClassID="9"/>
  6. <StudentStudentName="李頔飞"Sex="男"ClassID="10"/>
  7. <StudentStudentName="侯潇楠"Sex="女"ClassID="11"/>
  8. <StudentStudentName="杨超"Sex="男"ClassID="1"/>
  9. <StudentStudentName="陈磊"Sex="男"ClassID="2"/>
  10. <StudentStudentName="张涛"Sex="男"ClassID="3"/>
  11. <StudentStudentName="周立华"Sex="女"ClassID="4"/>
  12. <StudentStudentName="陈荔"Sex="女"ClassID="5"/>
  13. <StudentStudentName="赵欣环"Sex="男"ClassID="7"/>
  14. <StudentStudentName="黄博"Sex="男"ClassID="9"/>
  15. <StudentStudentName="苏三东"Sex="男"ClassID="10"/>
  16. <StudentStudentName="吴佳嵘"Sex="男"ClassID="11"/>
  17. <StudentStudentName="王立岩"Sex="女"ClassID="1"/>
  18. <StudentStudentName="季刚"Sex="女"ClassID="2"/>
  19. <StudentStudentName="李文达"Sex="男"ClassID="3"/>
  20. <StudentStudentName="高爱文"Sex="男"ClassID="4"/>
  21. <StudentStudentName="杨过"Sex="男"ClassID="9"/>
  22. <StudentStudentName="黄蓉"Sex="女"ClassID="3"/>
  23. <StudentStudentName="小新"Sex="男"ClassID="6"/>
  24. </Students>
Code:
  1. <Windowx: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. <XmlDataProviderx:Key="stuList"Source="Students.xml"
  10. XPath="/sb:Students/sb:Student">
  11. <XmlDataProvider.XmlNamespaceManager>
  12. <XmlNamespaceMappingCollection>
  13. <XmlNamespaceMappingUri="http://sonny.com"Prefix="sb"/>
  14. </XmlNamespaceMappingCollection>
  15. </XmlDataProvider.XmlNamespaceManager>
  16. </XmlDataProvider>
  17. <DataTemplatex:Key="showStudentTemplate">
  18. <TextBlock>
  19. <TextBlockText="{BindingXPath=@StudentName}"/>(<TextBlockText="{BindingXPath=@Sex}"/>:<TextBlockText="{BindingXPath=@ClassID}"/>)
  20. </TextBlock>
  21. </DataTemplate>
  22. </Window.Resources>
  23. <GridMargin="5"DataContext="{StaticResourcestuList}">
  24. <Grid.Resources>
  25. <StyleTargetType="TextBlock">
  26. <SetterProperty="Margin"Value="5"/>
  27. <SetterProperty="VerticalAlignment"Value="Center"/>
  28. </Style>
  29. <StyleTargetType="TextBox">
  30. <SetterProperty="Margin"Value="5"/>
  31. <SetterProperty="VerticalAlignment"Value="Center"/>
  32. </Style>
  33. <StyleTargetType="ListBox">
  34. <SetterProperty="Margin"Value="5"/>
  35. </Style>
  36. <StyleTargetType="Button">
  37. <SetterProperty="Margin"Value="5"/>
  38. <SetterProperty="Width"Value="65"/>
  39. <SetterProperty="Height"Value="25"/>
  40. <SetterProperty="HorizontalAlignment"Value="Left"/>
  41. </Style>
  42. </Grid.Resources>
  43. <Grid.RowDefinitions>
  44. <RowDefinition/>
  45. <RowDefinitionHeight="Auto"/>
  46. <RowDefinitionHeight="Auto"/>
  47. <RowDefinitionHeight="Auto"/>
  48. <RowDefinitionHeight="Auto"/>
  49. </Grid.RowDefinitions>
  50. <Grid.ColumnDefinitions>
  51. <ColumnDefinitionWidth="80"/>
  52. <ColumnDefinition/>
  53. </Grid.ColumnDefinitions>
  54. <TextBlockText="List:"Grid.Row="0"Grid.Column="0"/>
  55. <TextBlockText="Name:"Grid.Row="1"Grid.Column="0"/>
  56. <TextBlockText="Gender:"Grid.Row="2"Grid.Column="0"/>
  57. <TextBlockText="Class:"Grid.Row="3"Grid.Column="0"/>
  58. <ListBoxGrid.Row="0"Grid.Column="1"ItemsSource="{Binding}"IsSynchronizedWithCurrentItem="True"
  59. ItemTemplate="{StaticResourceshowStudentTemplate}">
  60. <ListBox.GroupStyle>
  61. <GroupStyle>
  62. <GroupStyle.HeaderTemplate>
  63. <DataTemplate>
  64. <TextBlockBackground="Black"Foreground="White"FontWeight="Bold">
  65. <TextBlockText="{BindingXPath=@ClassID}"/>
  66. (<TextBlockText="{BindingItemCount}"/>)
  67. </TextBlock>
  68. </DataTemplate>
  69. </GroupStyle.HeaderTemplate>
  70. </GroupStyle>
  71. </ListBox.GroupStyle>
  72. </ListBox>
  73. <TextBoxGrid.Row="1"Grid.Column="1"Name="txtName"Text="{BindingXPath=@StudentName}"/>
  74. <TextBoxGrid.Row="2"Grid.Column="1"Name="txtGender"Text="{BindingXPath=@Sex}"/>
  75. <TextBoxGrid.Row="3"Grid.Column="1"Name="txtClass"Text="{BindingXPath=@ClassID}"/>
  76. <StackPanelOrientation="Horizontal"Grid.Row="4"Grid.Column="1">
  77. <ButtonContent="Group"Name="cmdGroup"Click="cmdGroup_Click"/>
  78. </StackPanel>
  79. </Grid>
  80. </Window>
Code:
  1. usingSystem.Windows;
  2. usingSystem.Windows.Data;
  3. usingSystem.ComponentModel;
  4. namespaceDemo14_BindingFromXML{
  5. ///<summary>
  6. ///MainWindow.xaml的交互逻辑
  7. ///</summary>
  8. publicpartialclassMainWindow:Window{
  9. publicMainWindow(){
  10. InitializeComponent();
  11. }
  12. privatevoidcmdGroup_Click(objectsender,RoutedEventArgse){
  13. ICollectionViewview=GetDefaultView();
  14. if(view.GroupDescriptions.Count==0){
  15. view.GroupDescriptions.Add(newPropertyGroupDescription("@ClassID"));
  16. }else{
  17. view.GroupDescriptions.Clear();
  18. }
  19. }
  20. privateICollectionViewGetDefaultView(){
  21. DataSourceProviderprovider=(DataSourceProvider)this.FindResource("stuList");
  22. varcollection=provider.Data;
  23. ICollectionViewview=CollectionViewSource.GetDefaultView(collection);
  24. returnview;
  25. }
  26. }
  27. }

注意:
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值