深入探讨WPF的ListView控件

接上一篇博客初步探讨WPF的ListView控件(涉及模板、查找子控件)  我们继续探讨ListView的用法

     一、实现排序功能

需求是这样的:假如我们把学生的分数放入ListView,当我们单机ListView头部时候实现对按分数的排序,更改Xaml如下:

<Window x:Class="ContentDataTemplate.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:c="clr-namespace:System.Collections;assembly=mscorlib"
        xmlns:local="clr-namespace:ContentDataTemplate"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <c:ArrayList x:Key="stuList">
            <local:Student Id="1" Name="小明" Grade="研一" Professional="计算机技术" Score="30" HasJob="true"></local:Student>
            <local:Student Id="2" Name="小李" Grade="大一" Professional="网络工程" Score="80" HasJob="true"></local:Student>
            <local:Student Id="3" Name="小张" Grade="研一" Professional="软件工程" Score="100" HasJob="False"></local:Student>
            <local:Student Id="4" Name="小王" Grade="研一" Professional="自动化控制" Score="70" HasJob="true"></local:Student>
            <local:Student Id="5" Name="大王" Grade="研一" Professional="软件设计" Score="60" HasJob="False"></local:Student>
        </c:ArrayList>
        <DataTemplate x:Key="NameDt">
            <TextBox x:Name="textboxName" Text="{Binding Name}" GotFocus="textboxName_GotFocus"></TextBox>
        </DataTemplate>
        <DataTemplate x:Key="GradeDt">
            <TextBox x:Name="textboxGrade" Text="{Binding Grade}"></TextBox>
        </DataTemplate>
        <DataTemplate x:Key="ProfessionalDt">
            <TextBox x:Name="textboxProfessional" Text="{Binding Professional}"></TextBox>
        </DataTemplate>
        <DataTemplate x:Key="ScoreDt">
            <TextBox Name="textboxScore" Text="{Binding Score}"></TextBox>
        </DataTemplate>
        <DataTemplate x:Key="HasJobDt">
            <CheckBox x:Name="CheckBocHasJob" IsChecked="{Binding HasJob}" Checked="CheckBocHasJob_Checked"></CheckBox>
        </DataTemplate>

    </Window.Resources>
    <Grid Margin="5">
        <ListView x:Name="ListViewStudent" ItemsSource="{StaticResource stuList}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="ID" DisplayMemberBinding="{Binding Id}"></GridViewColumn>
                    <GridViewColumn Header="姓名" CellTemplate="{StaticResource NameDt}"></GridViewColumn>
                    <GridViewColumn Header="年级" CellTemplate="{StaticResource GradeDt}"></GridViewColumn>
                    <GridViewColumn Header="专业" CellTemplate="{StaticResource ProfessionalDt}"></GridViewColumn>
                    <GridViewColumn Header="分数" CellTemplate="{StaticResource ScoreDt}"></GridViewColumn>
                    <GridViewColumn Header="已工作" CellTemplate="{StaticResource HasJobDt}"></GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>
</Window>

更改地方也不多,Student类添加Score属性,DataTemplate中增加Score的列模板,数据源添加一些默认的分数。

数据有了,下面就是排序功能了,首先写一个排序的函数:StuSort(string sortBy, ListSortDirection direction);排序功能的实现是通过CollectionViewSource类实现的,这个类我就不介绍了,可以对数据源进行排序分组什么的,详情参考MSDN 。代码如下:

  private void StuSort(ListView lv, string sortBy, ListSortDirection direction)
        {

            ICollectionView dataView =CollectionViewSource.GetDefaultView(lv.ItemsSource);//获取数据源视图
            dataView.SortDescriptions.Clear();//清空默认排序描述
            SortDescription sd = new SortDescription(sortBy, direction);
            dataView.SortDescriptions.Add(sd);//加入新的排序描述
            dataView.Refresh();//刷新视图
        }

函数写好了,介绍下此函数的三个参数,第一个毫无疑问是数据的承载着ListView了,第二个比较重要是要通过那个字段排序,本例子是通过Student的Score来排序,所以就是“Score”,第三个参数是排序方向,升序或者降序了。然后当我们点击ListView的Header的时候触发此函数。Xaml页面中的ListView中监控GridViewColumnHeaderClick的路由事件,

<ListView x:Name="ListViewStudent"
                  ItemsSource="{StaticResource stuList}"
                   GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler"
                  >

后台实现GridViewColumnHeaderClickedHandler事件,代码如下:

    private void GridViewColumnHeaderClickedHandler(object sender, RoutedEventArgs e)
        {
            GridViewColumnHeader gch=e.OriginalSource as GridViewColumnHeader;
            StuSort(this.ListViewStudent, "Score", ListSortDirection.Ascending);
        }

运行,单机分数,实现排序功能。

二、具有强大视图功能ListView

ListView可以提供不同的视图功能切换,但是默认提供了仅仅是GridView,那我们是不是可以自定义自己的View呢,答案是肯定的。我就不再细说因为微软的示例已经很好了,http://msdn.microsoft.com/zh-cn/library/vstudio/ms771469(v=vs.90).aspx 。讲的很详细,一共提供了四种自定义视图。

深入探讨WPF的ListView控件

时间: 2024-10-01 19:31:20

深入探讨WPF的ListView控件的相关文章

初步探讨WPF的ListView控件(涉及模板、查找子控件)

本文结合模板的应用初步介绍ListView的应用 一.Xaml中如何建立数据资源 大部分数据都会来自于后台代码,如何Xaml同样的建立数据源呢?比如建立一个学生List: 首先引入命名空间: xmlns:c="clr-namespace:System.Collections;assembly=mscorlib" 然后代码如下:   <c:ArrayList x:Key="stuList">            <local:Student Id=

WPF的ListView控件自定义布局用法实例

本文实例讲述了WPF的ListView控件自定义布局用法.分享给大家供大家参考,具体如下: 概要: 以源码的形式贴出,免得忘记后,再到网上查资料.在VS2008+SP1环境下调试通过 引用的GrayscaleEffect模块,可根据参考资料<Grayscale Effect...>中的位置下载. 正文: 如何布局是在App.xaml中定义源码如下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

C#如何解决对ListView控件更新以及更新时界面闪烁问题

第一个问题:如何更新ListView控件内容 很多时候运行窗体程序时,由于程序中使用了多线程加之操作不当,所以在对控件操作时会出现下面这样的异常: 这是因为我们在窗体中添加的控件都有属于自己的线程,所以不能从其它线程来访问它. 那要如何解决? 使用委托:MethodInvoker,我用这个挺方便的.下面举一个用例: 1 //调用InitListView(),便可以对ListView控件进行自由更新啦 2 private void InitListView() 3 { 4 MethodInvoke

C#在listview控件中显示数据库数据

一.了解listview控件的属性 view:设置为details columns:设置列 items:设置行 1.将listview的view设置为details 2.设置列属性 点击添加,添加一列 设置一列的Text属性,这就是列名 添加三列 3.编辑items属性,添加一行数据 编辑Text属性,添加一行的第一个数据 编辑subitems属性,添加一行中的其他数据 添加两个数据 填写结果 二.在listview中显示数据库数据 //在listview中显示数据库数据 private voi

Windows应用程序高级控件之ListView控件

ListView控件---列表视图控件 用途:显示带图标的项列表,其中可以显示大图标.小图标和数据 ListView控件的常用属性: View属性:设置项在控件中的显示方式,View属性的值有以下几种 Details       每个项显示在不同的行上 LargeIcon     每个项都显示为一个最大的图标,下面有标签,是默认的视图模式 List          每个项显示为一个小图标,右边带标签,各项排列在列中,没有列表头 SmallIcon     每个项显示为小图标,右边带标签 Tit

C#跨进程读取listview控件中的数据

http://www.cnblogs.com/Charltsing/p/slv32.html 欢迎交流:QQ564955427 读取标准的32位listview控件中的数据,网上已经有很多代码了.今天有空也做了个测试.读取TcpEye软件中的数据. 具体见程序附件.  下载(本程序可以自己修改主窗体类名和子窗体类名,抓取其他的软件数据.当然,窗体层次必须是2层,而且不能有多个同类名的子窗体,因为这只是个示例程序) *****************************************

Windows程序==&gt;&gt;使用ListView控件展示数据

使用ListView控件展示数据 01.ImageList控件 1.了解了解         属性 说明 Images 储存在图像列表中的所有图像 ImageSize 图像列表中图像的大小 Transparent 被视为透明的颜色 ColorDepth 获取图像列表的颜色深度 Images中图像的存放方式与存放在数组中一样,通过Count属性可以获得Images中图像的个数.每个图像都有一个索引值,从0开始,使用Images[索引值],可以定位到一个图像. ImageList控件所包含的图像可以

【Visual Basic】vb6的ListView控件,对Access2003数据库的增删改查,判断是否有中文、多窗体操作

vb6对Access2003数据库的增删改查并不复杂,可以通过ado对象轻松完成,下面举个小例子,同时说明vb6中的ListView控件的使用.虽然在<[Visual Basic]列表控件ListView的增删改查.模态对话框.禁止窗口调整大小>曾经对VB.NET的ListView控件进行详细的说明,但是证明微软就是个坑爹货,vb6对于ListView实现的代码居然跟VB.NET有着彻底的不同,似乎换了一门语言似得的.改代码什么的最讨厌的. 首先,在vb6生成的工程文件夹中有着一个db1.md

WPF多线程访问控件

大家知道WPF中多线程访问UI控件时会提示UI线程的数据不能直接被其他线程访问或者修改,该怎样来做呢? 分下面两种情况 1.WinForm程序 1 2 1)第一种方法,使用委托: 3 private delegate void SetTextCallback(string text); 4 private void SetText(string text) 5 { 6 // InvokeRequired需要比较调用线程ID和创建线程ID 7 // 如果它们不相同则返回true 8 if (thi