WPF在绑定XML时会有一些麻烦,经常是不显示列表内容,但是内容项却是存在,这说明配置XAML信息有误,见图例效果,绑定XML数据源,且能实现分组。
1.XML数据源,其中xmlns是命名空间,后面代码中会将其改成前缀名sb使用
- <?xml version="1.0" encoding="utf-8" ?>
- <Students xmlns="http://sonny.com">
- <Student StudentName="李金香" Sex="女" ClassID="4"/>
- <Student StudentName="张亮" Sex="男" ClassID="7"/>
- <Student StudentName="张利华" Sex="女" ClassID="9"/>
- <Student StudentName="李頔飞" Sex="男" ClassID="10"/>
- <Student StudentName="侯潇楠" Sex="女" ClassID="11"/>
- <Student StudentName="杨超" Sex="男" ClassID="1"/>
- <Student StudentName="陈磊" Sex="男" ClassID="2"/>
- <Student StudentName="张涛" Sex="男" ClassID="3"/>
- <Student StudentName="周立华" Sex="女" ClassID="4"/>
- <Student StudentName="陈荔" Sex="女" ClassID="5"/>
- <Student StudentName="赵欣环" Sex="男" ClassID="7"/>
- <Student StudentName="黄博" Sex="男" ClassID="9"/>
- <Student StudentName="苏三东" Sex="男" ClassID="10"/>
- <Student StudentName="吴佳嵘" Sex="男" ClassID="11"/>
- <Student StudentName="王立岩" Sex="女" ClassID="1"/>
- <Student StudentName="季刚" Sex="女" ClassID="2"/>
- <Student StudentName="李文达" Sex="男" ClassID="3"/>
- <Student StudentName="高爱文" Sex="男" ClassID="4"/>
- <Student StudentName="杨过" Sex="男" ClassID="9"/>
- <Student StudentName="黄蓉" Sex="女" ClassID="3"/>
- <Student StudentName="小新" Sex="男" ClassID="6"/>
- </Students>
- <Window x:Class="Demo14_BindingFromXML.MainWindow"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:sys="clr-namespace:System;assembly=mscorlib"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:xm="clr-namespace:System.Xml;assembly=System.Xml"
- xmlns:local="clr-namespace:Demo14_BindingFromXML"
- Title="MainWindow" Height="333" Width="496">
- <Window.Resources>
- <XmlDataProvider x:Key="stuList" Source="Students.xml"
- XPath="/sb:Students/sb:Student">
- <XmlDataProvider.XmlNamespaceManager>
- <XmlNamespaceMappingCollection>
- <XmlNamespaceMapping Uri="http://sonny.com" Prefix="sb" />
- </XmlNamespaceMappingCollection>
- </XmlDataProvider.XmlNamespaceManager>
- </XmlDataProvider>
- <DataTemplate x:Key="showStudentTemplate">
- <TextBlock>
- <TextBlock Text="{Binding XPath=@StudentName}" />(<TextBlock Text="{Binding XPath=@Sex}" />:<TextBlock Text="{Binding XPath=@ClassID}" />)
- </TextBlock>
- </DataTemplate>
- </Window.Resources>
- <Grid Margin="5" DataContext="{StaticResource stuList}">
- <Grid.Resources>
- <Style TargetType="TextBlock">
- <Setter Property="Margin" Value="5" />
- <Setter Property="VerticalAlignment" Value="Center" />
- </Style>
- <Style TargetType="TextBox">
- <Setter Property="Margin" Value="5" />
- <Setter Property="VerticalAlignment" Value="Center" />
- </Style>
- <Style TargetType="ListBox">
- <Setter Property="Margin" Value="5" />
- </Style>
- <Style TargetType="Button">
- <Setter Property="Margin" Value="5" />
- <Setter Property="Width" Value="65" />
- <Setter Property="Height" Value="25" />
- <Setter Property="HorizontalAlignment" Value="Left" />
- </Style>
- </Grid.Resources>
- <Grid.RowDefinitions>
- <RowDefinition />
- <RowDefinition Height="Auto" />
- <RowDefinition Height="Auto" />
- <RowDefinition Height="Auto" />
- <RowDefinition Height="Auto" />
- </Grid.RowDefinitions>
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="80" />
- <ColumnDefinition />
- </Grid.ColumnDefinitions>
- <TextBlock Text="List:" Grid.Row="0" Grid.Column="0"/>
- <TextBlock Text="Name:" Grid.Row="1" Grid.Column="0"/>
- <TextBlock Text="Gender:" Grid.Row="2" Grid.Column="0"/>
- <TextBlock Text="Class:" Grid.Row="3" Grid.Column="0"/>
- <ListBox Grid.Row="0" Grid.Column="1" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True"
- ItemTemplate="{StaticResource showStudentTemplate}">
- <ListBox.GroupStyle>
- <GroupStyle>
- <GroupStyle.HeaderTemplate>
- <DataTemplate>
- <TextBlock Background="Black" Foreground="White" FontWeight="Bold">
- <TextBlock Text="{Binding XPath=@ClassID}" />
- (<TextBlock Text="{Binding ItemCount}" />)
- </TextBlock>
- </DataTemplate>
- </GroupStyle.HeaderTemplate>
- </GroupStyle>
- </ListBox.GroupStyle>
- </ListBox>
- <TextBox Grid.Row="1" Grid.Column="1" Name="txtName" Text="{Binding XPath=@StudentName}" />
- <TextBox Grid.Row="2" Grid.Column="1" Name="txtGender" Text="{Binding XPath=@Sex}" />
- <TextBox Grid.Row="3" Grid.Column="1" Name="txtClass" Text="{Binding XPath=@ClassID}" />
- <StackPanel Orientation="Horizontal" Grid.Row="4" Grid.Column="1">
- <Button Content="Group" Name="cmdGroup" Click="cmdGroup_Click" />
- </StackPanel>
- </Grid>
- </Window>
- using System.Windows;
- using System.Windows.Data;
- using System.ComponentModel;
- namespace Demo14_BindingFromXML {
- /// <summary>
- /// MainWindow.xaml 的交互逻辑
- /// </summary>
- public partial class MainWindow : Window {
- public MainWindow() {
- InitializeComponent();
- }
- private void cmdGroup_Click(object sender, RoutedEventArgs e) {
- ICollectionView view = GetDefaultView();
- if (view.GroupDescriptions.Count==0) {
- view.GroupDescriptions.Add(new PropertyGroupDescription("@ClassID"));
- } else {
- view.GroupDescriptions.Clear();
- }
- }
- private ICollectionView GetDefaultView() {
- DataSourceProvider provider = (DataSourceProvider)this.FindResource("stuList");
- var collection = provider.Data;
- ICollectionView view = CollectionViewSource.GetDefaultView(collection);
- return view;
- }
- }
- }
注意:
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