初步探讨WPF的ListView控件(涉及模板、查找子控件)
本文结合模板的应用初步介绍ListView的应用
一、Xaml中如何建立数据资源
大部分数据都会来自于后台代码,如何Xaml同样的建立数据源呢?比如建立一个学生List:
首先引入命名空间: xmlns:c="clr-namespace:System.Collections;assembly=mscorlib"
然后代码如下:

- <c:ArrayList x:Key="stuList">
<local:Student Id="1" Name="小明" Grade="研一" Professional="计算机技术" HasJob="true"></local:Student>
<local:Student Id="2" Name="小李" Grade="大一" Professional="网络工程" HasJob="true"></local:Student>
<local:Student Id="3" Name="小张" Grade="研一" Professional="软件工程" HasJob="False"></local:Student>
<local:Student Id="4" Name="小王" Grade="研一" Professional="自动化控制" HasJob="true"></local:Student>
<local:Student Id="5" Name="大王" Grade="研一" Professional="软件设计" HasJob="False"></local:Student>
</c:ArrayList>

二、定义数据展示模板
展示数据使用的是ListView的View属性,MSDN解释:Gets or sets an object that defines how the data is styled and organized in a ListView control. 说明是可以在里面放一些数据样式和一些控件模板的。其实这个Control暂时只能是GridView。每一个Student就是一列数据,我们要把学生显示到列上,所以就用到了GridView的GridViewColumn属性。关于GridView不在细说,请查阅MSDN。
最终数据是展示在GridViewColumn上面的,那么我们就开始设计我们GridViewColumn的数据模板,代码如下:

- <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="HasJobDt">
- <CheckBox x:Name="CheckBocHasJob" IsChecked="{Binding HasJob}"></CheckBox>
- </DataTemplate>

我们为每列数据定义了数据展示模板,当然你也可以自己定义别的,我仅仅是示例下!
三、使用ListView展示数据
有了以上的准备,下面就是通过ListView把数据和数据模板,通过绑定等联接起来了,需要注意的是,我们第二步定义的模板应用到的是CellTemplate上面,其实就是单元格的数据模板。
代码如下:

- <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 HasJobDt}"></GridViewColumn>
- </GridView>
- </ListView.View>
- </ListView>

这样与运行程序,成功实现了绑定,并通过自己自定义的模板显示了数据,而且数据显示格式是自定义的,当然你可以不用模板,使用默认的模板,这样是不能改动数据的。默认的我就不介绍了。
四、ListView之数据操作
数据展示完了,那么数据操作呢?
比如我们有这么一个需求:当点击CheckBox时候,需要获取学生的信息,然后进行相关操作等。
我们在CheckBox的Checked事件下面写如下代码:

- private void CheckBocHasJob_Checked(object sender, RoutedEventArgs e)
- {
- CheckBox tb = e.OriginalSource as CheckBox;
- ContentPresenter cp = tb.TemplatedParent as ContentPresenter;
- Student stu = cp.Content as Student;
- MessageBox.Show(stu.Name + stu.Grade + stu.Professional);
- }

这段代码不难理解,首先通过 e.OriginalSource获取是那个控件触发的事件,通过控件的TemplatedParent属性,查找到上层的数据展示模板(其实是ListView视觉树里面的数据呈现模板)。这样通过Content属性即可获得Student的相关信息了。
五、Listview之控件查找
比如有这么一个需求:我想知道我点击选中checkbox的时候,这个CheckBox的控件名字是什么?
首先分析一下,CheckBox是模板里面的,不在逻辑树上,肯定要是用VaisualTreeHelper这个类,实现这个功能之前需要借助一个函数,此函数功能是获取控件逻辑树或视觉树上的指定类型控件。如下:

- private ChildType FindVisualChild<ChildType>(DependencyObject obj) where ChildType : DependencyObject
- {
- for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
- {
- DependencyObject child = VisualTreeHelper.GetChild(obj,i);
- if (child!=null&& child is ChildType)
- {
- return child as ChildType;
- }
- else
- {
- ChildType childOfChildren = FindVisualChild<ChildType>(child);
- if (childOfChildren!=null)
- {
- return childOfChildren;
- }
- }
- }
- return null;
- }

有了以上这个函数,功能就很好实现了,ListviewItem作为参数传入,查找CheckBox类型的控件即可:修改Checked事件代码如下:

- private void CheckBocHasJob_Checked(object sender, RoutedEventArgs e)
- {
- //访问业务逻辑数据
- CheckBox tb = e.OriginalSource as CheckBox;
- ContentPresenter cp = tb.TemplatedParent as ContentPresenter;
- Student stu = cp.Content as Student;
- MessageBox.Show(stu.Name + stu.Grade + stu.Professional);
- // this.ListViewStudent.SelectedItem = stu;
- //访问界面元素
- ListViewItem lvi = this.ListViewStudent.ItemContainerGenerator.ContainerFromItem(stu) as ListViewItem;
- CheckBox cb = FindVisualChild<CheckBox>(lvi);
- MessageBox.Show(cb.Height + cb.Name + cb.Width);
- }

OK,这样你就可以成功获取到你想要的任何东西了~~~
全部代码:
Xaml:
C# CODE:
后面我会继续深入介绍ListView的使用,包括样式、分组、排序等,敬请期待。
---------------------------------------------------------------------------------------------------------------------------------------------
作者:GavinDream(GavinJune主页 博客园) 出处:http://www.cnblogs.com/fuchongjundream/ 任何转载必须保留完整文章,在显要地方显示署名以及原文链接。如您有任何疑问或者授权方面的协商,请发邮件给我 或者 留言。
初步探讨WPF的ListView控件(涉及模板、查找子控件)的更多相关文章
- 初步探讨WPF的ListView控件(涉及模板、查找子控件) - GavinJun
本文结合模板的应用初步介绍ListView的应用 一.Xaml中如何建立数据资源 大部分数据都会来自于后台代码,如何Xaml同样的建立数据源呢?比如建立一个学生List: 首先引入命名空间: xmln ...
- 深入探讨WPF的ListView控件
接上一篇博客初步探讨WPF的ListView控件(涉及模板.查找子控件) 我们继续探讨ListView的用法 一.实现排序功能 需求是这样的:假如我们把学生的分数放入ListView,当我 ...
- WPF通过不透明蒙板切割显示子控件
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/Backspace110/article/ ...
- 【转】WPF查找子控件和父控件方法
一.查找某种类型的子控件,并返回一个List集合 public List<T> GetChildObjects<T>(DependencyObject obj, Type ty ...
- WPF查找子控件和父控件方法
一.查找某种类型的子控件,并返回一个List集合 public List<T> GetChildObjects<T>(DependencyObject obj, Type ty ...
- Repeater 模板中查找子控件
前言:对于Repeater控件,相信从事NETWeb开发的同仁们再熟悉不过了.因其呈现方式和Literal一样,并不在前端生成任何表单标签元素,所以属于比较轻量级的控件.不过青睐于Repeater的主 ...
- WPF中如何使用代码操作数据模板生成的控件
有一个Listbox,里面的Item是通过数据模板生成的,如下所示: <Border Margin="15" BorderBrush="Aqua" Bor ...
- C# WPF 父控件通过使用可视化树找到子控件
在我们使用WPF设计前台界面时,经常会重写数据模板,或者把控件放到数据模板里.但是一旦将控件放到数据模板中,在后台就没有办法通过控件的名字来获取它了,更没办法对它进行操作(例如,隐藏,改变控件的某个值 ...
- WPF布局控件与子控件的HorizontalAlignment/VerticalAlignment属性之间的关系
WPF布局控件与子控件的HorizontalAlignment/VerticalAlignment属性之间的关系: 1.Canvas/WrapPanel控件: 其子控件的HorizontalAlign ...
随机推荐
- Intellij IDEA 安装 Mybatis插件
1.Ctrl+Alt+s
- SELECTION-SCREEN 加按钮
这是我喜欢的这种模式,选择屏加个新建按钮,直接跳转到主屏幕做单据. 选择屏就直接查询,双击查询结果跳转到主屏幕.... 做好编辑控制,事件处理...EVERYTHING IS SOOOOOOO NIC ...
- 继承多态绕点 C#篇
最近在看博客的时候看到一块很绕的地方,有点类似于以前学习C语言是的i++,++i组合到一起使用的情况,很坑b的,绝对会比i++,++i这种情况更有用,虽然实际代码里面确实很少出现. 面对象像三大特点不 ...
- Maven(1)-安装和配置
Maven(1)-安装和配置 一.本机必须安装好Jdk 二 .maven下载 http://maven.apache.org/download.cgi ,下载后把maven-bin解压到自己的目录即可 ...
- FileUpload上传与下载
后台代码: public string connstr = "server=128.1.3.113;database=test;uid=sa;pwd=pass"; protecte ...
- 盘点十大最流行的Linux服务器发行版
随着Linux不断发展,Linux所支持的文件系统类型也在迅速扩充.很多的数据中心服务器上都运行着Linux,可以节省大量的许可证费用及维护费用.但伴随着Linux新版本的发行,其中每一个不同版本的L ...
- winform开发中绑定combox到枚举
开发中需要根据下拉框的选择处理一些业务逻辑,使用ID值或Text值都不利于代码维护,所以可以写个扩展方法绑定到枚举上. public static class Extensions { /// < ...
- hduacm 5255
http://acm.hdu.edu.cn/showproblem.php?pid=5255 枚举a和c 求解b #include <cstdio> #include <cstri ...
- spring任务计划
小组 第一次小组会议结果 贾川和刘三龙负责这些任务: 1:4.11 搭配开发必要的环境,vs2010 2:4.12学习windows界面开发的基本知识 3:4.13-4.15 和小组成员讨论软件界面的 ...
- ASP.NET MVC 基于角色的权限控制系统的示例教程
上一次在 .NET MVC 用户权限管理示例教程中讲解了ASP.NET MVC 通过AuthorizeAttribute类的OnAuthorization方法讲解了粗粒度控制权限的方法,接下来讲解基于 ...