书名:WPF专业编程指南
作者:李应保
出版社:电子工业出版社
出版时间:2010-01
ISBN:9787121100116
一、ListView
- ListView也是一个老的控件,它和ListBox非常类似,所以它是ListBox的派生类。ListView和ListBox不同的地方在于,ListView有多列,而且每列都有头。ListView默认的SelectionMode为Extended。
二、
- 在XAML中创建ListView头非常简单,下面的几行代码就创建了一个ListView的头:
<ListView>
<ListView.View>
<GridView>
<GridViewColumn Width ="100" Header ="姓名"/>
<GridViewColumn Width ="100" Header ="工作年限"/>
<GridViewColumn Width ="100" Header ="办公电话"/>
<GridViewColumn Width ="100" Header ="电邮"/>
</GridView>
</ListView.View>
</ListView>
- 若在上面的ListView里放入数据,通常ListView用于建立数据表。如直接和ADO的DataSet中的Table相连,或与XML数据进行绑定。
在C#中创建一个PersonaInfoList:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
namespace Yingbao.Chapter6
{
public partial class UseListView : System.Windows.Window
{
private ObservableCollection<PersonalInfo> personalInfoList
= new ObservableCollection<PersonalInfo>();
public ObservableCollection<PersonalInfo> PersonalInfoList
{
get { return this.personalInfoList; }
}
public UseListView()
{
personalInfoList.Add(new PersonalInfo("程俊", 8,
"4338819", "chenJun@hotmail.com"));
personalInfoList. Add(new PersonalInfo("张珊", 12,
"6566665", "zhangshang@hotmail.com"));
personalInfoList. Add(new PersonalInfo("陶铸", 7,
"65765675", "taozhu@hotmail.com"));
personalInfoList.Add(new PersonalInfo("李伟光", 25,
"342354325", "liweiguang@hotmail.com"));
personalInfoList.Add(new PersonalInfo("刘表", 3,
"2342343", "liubiao@hotmail.com"));
InitializeComponent();
}
private void AddRow_Click(object sender,
RoutedEventArgs rea)
{
personalInfoList.Add(new PersonalInfo("林晓霜", 1,
"34523654", "xiaoshuanglin@hotmail.com"));
}
}
public class PersonalInfo
{
private string name;
public string Name
{
get{ return this.name;}
set{ this.name = value;}
}
private int workYears;
public int WorkYears
{
get{ return this.workYears;}
set {this.workYears = value;}
}
private string workPhoneNumber;
public string WorkPhoneNumber
{
get{ return this.workPhoneNumber; }
set{ this.workPhoneNumber = value;}
}
private string email;
public string Email
{
get{ return this.email;}
set{ this.email = value;}
}
public PersonalInfo(string name, int year,
string phoneno, string email)
{
this.name = name;
this.workYears = year;
this.workPhoneNumber = phoneno;
this.email = email;
}
}
}
PersonalInfoList是一个ObservableCollection<T>,这个类是.NET 2.0引入的,它是一个模板类,其特点是它允许有一个观察者。当把数据绑定到ListView上时,ListView就是PersonalInfoList的观察者。当PersonalInfoList中的数据发生变化时,ListView会自动反映这种变化。
PersonalInfoList里面存放的是PersonalInfo对象,这个类很简单,它存有姓名、工作年限、办公电话、电邮等信息。XAML程序:
<Window x:Class="Yingbao.Chapter6.UseListView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml
Title="Yingbao.Chapter6" Height="300" Width="500"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<StackPanel>
<ListView ItemsSource="{Binding PersonalInfoList}" >
<ListView.View>
<GridView>
<GridViewColumn Width ="100" Header ="姓名"
DisplayMemberBinding="{Binding Path=Name }" />
<GridViewColumn Width ="100" Header ="工作年限"
DisplayMemberBinding="{Binding Path=WorkYears }"/>
<GridViewColumn Width ="100" Header ="办公电话"
DisplayMemberBinding="{Binding Path=WorkPhoneNumber}"/>
<GridViewColumn Width ="100" Header ="电邮"
DisplayMemberBinding="{Binding Path=Email}"/>
</GridView>
</ListView.View>
</ListView>
<Button HorizontalAlignment="Right" Margin="5,5,5,5"
Content="Add Row" Click="AddRow_Click" />
</StackPanel>
</Window>
-
图6-21是这个程序的运行结果。由于在上面的程序中,使用的是StackPanel排版,所以在按“增加记录”按钮时,“增加记录”按键自己往下移动。解决这一问题的方法是用Grid或Canvas来代替StackPanel,
GridView支持拖放功能,可以使用拖放功能任意改变ListView中列的位置。但遗憾的是,GridView并不支持排序功能。若要对记录进行排序,需要做进一步工作。
图6-21 ListView示例
