文章目录

  • 一、前言
  • 二、GridView
    • 2.1. 概述
    • 2.2. GridView是什么?
    • 2.3. GridView布局与样式
      • 2.3.1. 在GridView中定义与样式化列
      • 2.3.2. 添加可视化元素到GridView
      • 2.3.3. GridView中设置行样式
      • 2.3.4. ItemContainerStyle中的对齐问题
    • 2.4. 与GridView进行用户交互
    • 2.5. 其它自定义View
  • 三、结语

一、前言

项目中要用到一个数据分页栏,虽然自己没有实现过,但凭经验感觉它和ListBox/ListView有关。于是去网上搜了下WPF 数据分页栏,果然很多实现都用到了ListView。于是拣了一种比较简单的实现学习,其中包含下面代码:

     <ListView Grid.Row="1" ItemsSource="{Binding UserList}"><ListView.View><GridView><GridView.Columns><GridViewColumn DisplayMemberBinding="{Binding UserName}" Header="用户名"/><GridViewColumn DisplayMemberBinding="{Binding Password}" Header="密码"/><GridViewColumn DisplayMemberBinding="{Binding Level}" Header="权限等级"/></GridView.Columns></GridView></ListView.View></ListView>

ListView.View的标签内出现了GridView。
在我印象中Grid是网格式的,而List是列表式的,所以我很好奇两者为什么可以混到一起。当然从类的关系上来看,应该是两者都继承了一个共同的父类。那么为了能使用起来更“自如”,对GridView有个系统的了解,还是有必要学习一下。

二、GridView

2.1. 概述

GridView视图模式是ListView控件的视图模式中的一种。GridView及其辅助类能让你在表中来查看集合中的数据项,且可以通过表头来进行交互(表头是个按钮,可以给它加各种交互功能,如排序)。

2.2. GridView是什么?

GridView视图模式通过给列绑定数据字段和显示列标题来标识字段来显示数据项列表(说白了就是给一列数据加个标题header来说明这列数据是什么,然后将数据集合绑定到这列数据下面,一列数据就自动呈现出来了)。默认的GridView样式将按钮实现为列标题。

列标题 header
成员1 P1

所谓列标题可以理解为表头。
通过对列标题使用按钮,你能实现用户交互功能。例如,单击列标题来给某一列的内容进行排序。

注意:
GridView给列标题使用的Button控件就是ButtonBase的派生类。

下图是一个ListView的GridView视图展示:

下面介绍它的常用功能(或者说特性),如果你用过Excel的话,会发现这些都是熟悉的功能。

  • GridView列由GridViewColumn对象表示,能根据其内容自动调整大小,你也可以显示地指定GridViewColumn的宽度。
  • 你可以在表头间拖动来调整列的大小。
  • 可以动态的增、删、替换和重新排列,这些都是GridView内置的功能

不过,GridView不能直接更新它显示的数据。

下面示例展示了如何定义一个显示employee类型数据的GridView。本例中,ListView将EmployeeInfoDataSource定义为ItemsSource。DisplayMemberBinding属性定义将GridViewColumn的内容绑定到EmployeeInfoDataSource的数据成员。

注意:
上面这段话用“定义”这个词,而不是设置(其实从理解角度讲都行)。
转换成后端代码表示的话,定义就更加好理解了。
后文也有反复出现定义一词,有时候换成设置更好理解。
<ListView ItemsSource="{Binding Source={StaticResource EmployeeInfoDataSource}}"><ListView.View><GridView AllowsColumnReorder="true" ColumnHeaderToolTip="Employee Information"><GridViewColumn DisplayMemberBinding="{Binding Path=FirstName}" Header="First Name" Width="100"/><GridViewColumn DisplayMemberBinding="{Binding Path=LastName}" Width="100"><GridViewColumnHeader>Last Name<GridViewColumnHeader.ContextMenu><ContextMenu MenuItem.Click="LastNameCM_Click" Name="LastNameCM"><MenuItem Header="Ascending" /><MenuItem Header="Descending" /></ContextMenu></GridViewColumnHeader.ContextMenu></GridViewColumnHeader></GridViewColumn><GridViewColumn DisplayMemberBinding="{Binding Path=EmployeeNumber}" Header="Employee No." Width="100"/></GridView></ListView.View>
</ListView>

下图展示了上面示例创建的表。GridView控件显示了来自ItemSource的数据:

2.3. GridView布局与样式

GridViewColumn的列单元格和列标题具有相同的宽度。默认情况下,每个列都会调整其宽度以适应其内容。当然,你也可以为其设置固定宽度。相关数据内容显示在水平行中。例如,在上面图示中,每个员工(employee类型)的姓(last name)、名(first name)和ID都作为一个集合被显示,因为它们在一个行中。

其实就是把集合元素中的数据平铺到一行来显示。
employee
{FirstNameLastName     => FirstName | LastName | IDID
}

2.3.1. 在GridView中定义与样式化列

当定义数据字段在GridViewColumn中显示时,使用DisplayMemberBinding、CellTemplate或CellTemplateSelector属性。优先使用DisplayMemberBinding属性。

要指定GridView列中的内容对齐方式,需定义CellTemplate。不要对使用GridView显示的ListView内容使用HorizontalContentAlignment和VerticalContentAlignment属性。

若要为列标题(表头)指定模板和样式属性,需使用GridViewGridViewColumn和GridViewColumnHeader类。

2.3.2. 添加可视化元素到GridView

要在GridView视图中添加可视化元素,如CheckBox和Button控件,需使用模板或样式。

若你显式地将可视化元素定义为数据项,则它只能在GridView中出现一词。存在这种限制是因为一个元素只能有一个父亲。

2.3.3. GridView中设置行样式

使用GridViewRowPresenter 和GridViewHeaderRowPresenter 类来格式化和显示GridView的行。

2.3.4. ItemContainerStyle中的对齐问题

为了防止列标题和单元格之间的对齐问题,不要设置或指定影响ItemContainerStyle中项宽度的属性或模板。例如,不要设置Margin属性或指定一个ControlTemplate来将CheckBox添加到定义在ListView控件上的ItemContainerStyle中。取而代之,应该在定义GridView视图模式的类上指定属性或模板来直接影响列宽。

例如,要将CheckBox添加到GridView视图模式的行中,请将CheckBox添加到DataTemplate中,然后将CellTemplate属性设置为该DataTemplate。

2.4. 与GridView进行用户交互

当你在程序中使用了GridView时,用户可以与GridView交互并修改其格式。例如,用户可以重新排序列(拖动表头使整列移动)、调整列的大小、选中表中的项和滚动内容。你还可以定义用户单击列标题时响应的事件处理程序。事件处理程序可以执行类似于根据列内容对显示在GridView中的数据进行排序的操作。

下面列表详细讨论了使用GridView进行用户交互的功能:

  • 通过拖放对列重新排序
    当光标位于表头上时,用户可以按下鼠标左键,然后将该列拖动到新位置,从而对GridView的列进行重新排序。当用户拖动表头时,会显示标题的浮动列以及一条显示插入位置的实线。
    若你想要修改标题的浮动列样式,可以为GridViewColumnHeader指定一个ControlTemplate,当Role属性设置为Floating时将触发。
  • 根据列中内容调整列大小
    用户可以双击列标题右侧的钳子来调整列的大小以适应其内容。
    你可以将Width属性设置为Double.NaN来产生同样的效果。
  • 选中行项
    用户可以选择GridView的一个或多个项。
    如果要更改选中项的样式,请参见ListView中使用触发器对选中项进行样式设置。
  • 滚动查看内容
    若GridView的大小不足以显示所有项,用户可以使用ScrollViewer控件提供的滚动条水平或垂直滚动。若所有内容一开始都可见,滚动条将被隐藏。
  • 通过单击列标题按钮与列交互
    当用户单击列标题按钮时,如果你提供了排序算法,则可以对列中显示的数据进行排序。
    你可以自定义标题按钮的Click事件,以便提供排序算法之类的功能。若要为单个列表头处理Click事件,需在GridViewColumnHeader上设置事件处理程序。若要为所有列表头设置处理Click事件的事件处理程序,可在ListView控件上设置该处理程序。

2.5. 其它自定义View

GridView类派生自ViewBase抽象类,它只是ListView类的视图模式之一。你可以通过派生自ViewBase类来为ListView创建其它自定义的View。

三、结语

本文主要是功能上的介绍,并没有对其辅助类、方法实现、代码层面进行细致分析。
不过对于应用来讲,这种轮廓型的学习应该优先,而后遇到细节上的问题,再逐渐深入。
另外我以前用过Qt中的数据模型(Model)&数据视图(View),现在给我的感觉就是这类官方提供的View类型,通常内部帮你实现了许多方法,对于简单的使用,你只需要把数据源丢进去即可。

WPF——GridView相关推荐

  1. WPF系列:GridView列绑定控件(一)

    最近,在WPF方面的UI设计,设计很多控件的绑定和布局,因为刚开始学习,所以,有很多东西不是很懂,一边在网上搜,一边试着做,因为设计到在GridView中绑定控件,所有,在网上搜了搜,看了一篇很好的帖 ...

  2. WPF将数据库和GridView绑定并更改GridView模板

    首先来看一下如何使用GridView,在前台的话代码如下:这里仅仅举出一个例子,GridView是作为子项嵌套在ListView中的,这里的数据源是通过绑定的方式来绑定到GridView中的. < ...

  3. android listview 列宽度,WPF中用ListView时使GridView中的每列宽度按比例变化并使内容自适应单元宽度...

    在使用ListView的时候,GridView中的每列宽度默认是没法按比例变化的,我们可以使用一个跟它同大小的Grid,给Grid设置相同数量的列,设置好每列的宽度,然后将其宽度绑定到GridView ...

  4. 分享Silverlight/WPF/Windows Phone一周学习导读(07月25日-07月31日)

    上周,微软发布Visual Studio LightSwitch 2011正式版,为商业应用开发人员推出一个新的应用开发产品.Visual Studio LightSwitch 2011 作为一种简单 ...

  5. WPF入门知识(学习)

    WPF基础知识 快速学习绝不是从零学起的,良好的基础是快速入手的关键,下面先为大家摞列以下自己总结的学习WPF的几点基础知识: 1) C#基础语法知识(或者其他.NET支持的语言):这个是当然的了,虽 ...

  6. WPF多表头技术探索总结

    方案一:Grid+TextBlock嵌套DataGrid方式. 该方案是现在项目中已使用的方案.实现起来比较简单,但不具有通用性,不同数据DataGrid需要指定不同的TextBlock跨不同列.实现 ...

  7. WPF入门教程系列十九——ListView示例(一)

    经过前面的学习,今天我做一个比较综合的WPF程序示例,主要包括以下功能: 1) 查询功能.从数据库(本地数据库(local)/Test中的S_City表中读取城市信息数据,然后展示到WPF的Windo ...

  8. ASP.NET—001:GridView绑定List、页面返回值

    用惯了WPF的绑定,ASP.NET的绑定貌似不是很好用.下面看看ASP.NET绑定的用法.一般来说可以直接绑定DataTable的,不过我觉得绑定List比较符合面向对象编程. 绑定的方法是两句代码: ...

  9. GridView编辑删除操作

    第一种:使用DataSource数据源中自带的编辑删除方法,这样的不经常使用,在这里就不加说明了. 另外一种:使用GridView的三种事件:GridView1_RowEditing(编辑).Grid ...

  10. 分享Silverlight/WPF/Windows Phone/HTML5一周学习导读(4月2日-4月8日)

    分享Silverlight/WPF/Windows Phone/HTML5一周学习导读(4月2日-4月8日) 本周Silverlight学习资源更新 Microsoft Silverlight 4从入 ...

最新文章

  1. Android 多线程之可以重复启动与停止的服务
  2. Java记录 -38- 随机数
  3. 文件存储的原理和记事本打开文件的原理
  4. 015. Object event handling debug - Parameter COM_IOITF_DEBUG
  5. 新垣结衣自拍照_如何阻止自拍照出现在iPhone的自拍照专辑中
  6. Tomcat的BIO、NIO、ARP模式
  7. [bzoj5158][Tjoi2014]Alice and Bob
  8. activereport
  9. 考研准考证下载方式【当无法下载或者找到地址时】
  10. (35)zabbix Event acknowledgment事件确认
  11. html第三章练习1:音乐排行榜
  12. TensorFlow2.0 学习笔记(五):循环神经网络(RNN)
  13. 阴阳师1月服务器维护,阴阳师1月15日更新维护公告 鬼童丸降临平安京
  14. [转]管理的最高境界不是完美
  15. 如何在电脑浏览器查看微信文章
  16. web 页面 常用分辨率(PC 移动端)
  17. Python 遍历文件夹下所有文件 合并txt内容
  18. 生成式对抗网络GAN(一)—基于python实现
  19. 公司发了期权,我被坑了吗?
  20. 复旦微电子单片机【国产单片机】

热门文章

  1. 红外图像盲元修正MATLAB算法,红外图像盲元检测方法与流程
  2. 2020年的工程咨询将如何影响建设工程?
  3. python好玩的代码-我珍藏的一些好的Python代码,技巧
  4. PyQt+PyQtWebEngine+Spyder问题小结
  5. 图书信息管理系统需求分析
  6. Excel 数据库函数
  7. matlab GUI画图实例——手动输入函数画图
  8. 芯烨 Xprinter XP-DT108A 打印机驱动
  9. 有关于阿里云的历史-阿里云这群疯子
  10. IDL简单读写nc文件