博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
初步探讨WPF的ListView控件(涉及模板、查找子控件)
阅读量:5067 次
发布时间:2019-06-12

本文共 3721 字,大约阅读时间需要 12 分钟。

     本文结合模板的应用初步介绍ListView的应用

一、Xaml中如何建立数据资源

      大部分数据都会来自于后台代码,如何Xaml同样的建立数据源呢?比如建立一个学生List:

      首先引入命名空间: xmlns:c="clr-namespace:System.Collections;assembly=mscorlib"

      然后代码如下:     

  
           
           
           
           
           
       

二、定义数据展示模板

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

      最终数据是展示在GridViewColumn上面的,那么我们就开始设计我们GridViewColumn的数据模板,代码如下:

     

      我们为每列数据定义了数据展示模板,当然你也可以自己定义别的,我仅仅是示例下!

三、使用ListView展示数据

      有了以上的准备,下面就是通过ListView把数据和数据模板,通过绑定等联接起来了,需要注意的是,我们第二步定义的模板应用到的是CellTemplate上面,其实就是单元格的数据模板。

      代码如下:

     

     这样与运行程序,成功实现了绑定,并通过自己自定义的模板显示了数据,而且数据显示格式是自定义的,当然你可以不用模板,使用默认的模板,这样是不能改动数据的。默认的我就不介绍了。

四、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
(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
(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
(lvi); MessageBox.Show(cb.Height + cb.Name + cb.Width); }

OK,这样你就可以成功获取到你想要的任何东西了~~~

全部代码:

Xaml:

 
View Code

C# CODE:

 
View Code

 后面我会继续深入介绍ListView的使用,包括样式、分组、排序等,敬请期待。

 

转载于:https://www.cnblogs.com/sjqq/p/7823106.html

你可能感兴趣的文章
Git的使用--打tag
查看>>
F# 编程 借助 F# 构建 MVVM 应用程序
查看>>
ACFUN切换代码自用。。。
查看>>
网卡流量检测.py
查看>>
【转】Android的权限permission
查看>>
ajax
查看>>
poj1981 Circle and Points 单位圆覆盖问题
查看>>
POP的Stroke动画
查看>>
线程同步机制初识 【转载】
查看>>
Oracle 游标使用全解
查看>>
SQL语句在查询分析器中可以执行,代码中不能执行
查看>>
yii 1.x 添加 rules 验证url数组
查看>>
html+css 布局篇
查看>>
银行排队问题(详解队列)
查看>>
序列化和反序列化(1)---[Serializable]
查看>>
SQL优化
查看>>
用C语言操纵Mysql
查看>>
轻松学MVC4.0–6 MVC的执行流程
查看>>
4.9 Parser Generators
查看>>
redis集群如何清理前缀相同的key
查看>>