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

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

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

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

然后代码如下:

  1.   <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的数据模板,代码如下:

  1. <DataTemplate x:Key="NameDt">
  2. <TextBox x:Name="textboxName" Text="{Binding Name}" GotFocus="textboxName_GotFocus"></TextBox>
  3. </DataTemplate>
  4. <DataTemplate x:Key="GradeDt">
  5. <TextBox x:Name="textboxGrade" Text="{Binding Grade}"></TextBox>
  6. </DataTemplate>
  7. <DataTemplate x:Key="ProfessionalDt">
  8. <TextBox x:Name="textboxProfessional" Text="{Binding Professional}"></TextBox>
  9. </DataTemplate>
  10. <DataTemplate x:Key="HasJobDt">
  11. <CheckBox x:Name="CheckBocHasJob" IsChecked="{Binding HasJob}"></CheckBox>
  12. </DataTemplate>

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

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

代码如下:

  1. <ListView x:Name="ListViewStudent" ItemsSource="{StaticResource stuList}">
  2. <ListView.View>
  3. <GridView>
  4. <GridViewColumn Header="ID" DisplayMemberBinding="{Binding Id}"></GridViewColumn>
  5. <GridViewColumn Header="姓名" CellTemplate="{StaticResource NameDt}"></GridViewColumn>
  6. <GridViewColumn Header="年级" CellTemplate="{StaticResource GradeDt}"></GridViewColumn>
  7. <GridViewColumn Header="专业" CellTemplate="{StaticResource ProfessionalDt}"></GridViewColumn>
  8. <GridViewColumn Header="已工作" CellTemplate="{StaticResource HasJobDt}"></GridViewColumn>
  9. </GridView>
  10. </ListView.View>
  11. </ListView>

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

四、ListView之数据操作

数据展示完了,那么数据操作呢?

比如我们有这么一个需求:当点击CheckBox时候,需要获取学生的信息,然后进行相关操作等。

我们在CheckBox的Checked事件下面写如下代码:

  1. private void CheckBocHasJob_Checked(object sender, RoutedEventArgs e)
  2. {
  3.  
  4. CheckBox tb = e.OriginalSource as CheckBox;
  5. ContentPresenter cp = tb.TemplatedParent as ContentPresenter;
  6. Student stu = cp.Content as Student;
  7. MessageBox.Show(stu.Name + stu.Grade + stu.Professional);
  8.  
  9. }

这段代码不难理解,首先通过 e.OriginalSource获取是那个控件触发的事件,通过控件的TemplatedParent属性,查找到上层的数据展示模板(其实是ListView视觉树里面的数据呈现模板)。这样通过Content属性即可获得Student的相关信息了。

五、Listview之控件查找

比如有这么一个需求:我想知道我点击选中checkbox的时候,这个CheckBox的控件名字是什么?

首先分析一下,CheckBox是模板里面的,不在逻辑树上,肯定要是用VaisualTreeHelper这个类,实现这个功能之前需要借助一个函数,此函数功能是获取控件逻辑树或视觉树上的指定类型控件。如下:

  1. private ChildType FindVisualChild<ChildType>(DependencyObject obj) where ChildType : DependencyObject
  2. {
  3. for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
  4. {
  5. DependencyObject child = VisualTreeHelper.GetChild(obj,i);
  6. if (child!=null&& child is ChildType)
  7. {
  8. return child as ChildType;
  9. }
  10. else
  11. {
  12. ChildType childOfChildren = FindVisualChild<ChildType>(child);
  13. if (childOfChildren!=null)
  14. {
  15. return childOfChildren;
  16. }
  17. }
  18. }
  19. return null;
  20.  
  21. }

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

  1. private void CheckBocHasJob_Checked(object sender, RoutedEventArgs e)
  2. {
  3. //访问业务逻辑数据
  4. CheckBox tb = e.OriginalSource as CheckBox;
  5. ContentPresenter cp = tb.TemplatedParent as ContentPresenter;
  6. Student stu = cp.Content as Student;
  7. MessageBox.Show(stu.Name + stu.Grade + stu.Professional);
  8. // this.ListViewStudent.SelectedItem = stu;
  9.  
  10. //访问界面元素
  11. ListViewItem lvi = this.ListViewStudent.ItemContainerGenerator.ContainerFromItem(stu) as ListViewItem;
  12. CheckBox cb = FindVisualChild<CheckBox>(lvi);
  13. MessageBox.Show(cb.Height + cb.Name + cb.Width);
  14.  
  15. }

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

全部代码:

Xaml:

C# CODE:

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

---------------------------------------------------------------------------------------------------------------------------------------------

作者:GavinDream(GavinJune主页 博客园) 出处:http://www.cnblogs.com/fuchongjundream/ 任何转载必须保留完整文章,在显要地方显示署名以及原文链接。如您有任何疑问或者授权方面的协商,请发邮件给我 或者 留言

初步探讨WPF的ListView控件(涉及模板、查找子控件)的更多相关文章

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

    本文结合模板的应用初步介绍ListView的应用 一.Xaml中如何建立数据资源 大部分数据都会来自于后台代码,如何Xaml同样的建立数据源呢?比如建立一个学生List: 首先引入命名空间: xmln ...

  2. 深入探讨WPF的ListView控件

    接上一篇博客初步探讨WPF的ListView控件(涉及模板.查找子控件)  我们继续探讨ListView的用法      一.实现排序功能 需求是这样的:假如我们把学生的分数放入ListView,当我 ...

  3. WPF通过不透明蒙板切割显示子控件

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/Backspace110/article/ ...

  4. 【转】WPF查找子控件和父控件方法

    一.查找某种类型的子控件,并返回一个List集合 public List<T> GetChildObjects<T>(DependencyObject obj, Type ty ...

  5. WPF查找子控件和父控件方法

    一.查找某种类型的子控件,并返回一个List集合 public List<T> GetChildObjects<T>(DependencyObject obj, Type ty ...

  6. Repeater 模板中查找子控件

    前言:对于Repeater控件,相信从事NETWeb开发的同仁们再熟悉不过了.因其呈现方式和Literal一样,并不在前端生成任何表单标签元素,所以属于比较轻量级的控件.不过青睐于Repeater的主 ...

  7. WPF中如何使用代码操作数据模板生成的控件

    有一个Listbox,里面的Item是通过数据模板生成的,如下所示: <Border Margin="15" BorderBrush="Aqua" Bor ...

  8. C# WPF 父控件通过使用可视化树找到子控件

    在我们使用WPF设计前台界面时,经常会重写数据模板,或者把控件放到数据模板里.但是一旦将控件放到数据模板中,在后台就没有办法通过控件的名字来获取它了,更没办法对它进行操作(例如,隐藏,改变控件的某个值 ...

  9. WPF布局控件与子控件的HorizontalAlignment/VerticalAlignment属性之间的关系

    WPF布局控件与子控件的HorizontalAlignment/VerticalAlignment属性之间的关系: 1.Canvas/WrapPanel控件: 其子控件的HorizontalAlign ...

随机推荐

  1. Intellij IDEA 安装 Mybatis插件

    1.Ctrl+Alt+s

  2. SELECTION-SCREEN 加按钮

    这是我喜欢的这种模式,选择屏加个新建按钮,直接跳转到主屏幕做单据. 选择屏就直接查询,双击查询结果跳转到主屏幕.... 做好编辑控制,事件处理...EVERYTHING IS SOOOOOOO NIC ...

  3. 继承多态绕点 C#篇

    最近在看博客的时候看到一块很绕的地方,有点类似于以前学习C语言是的i++,++i组合到一起使用的情况,很坑b的,绝对会比i++,++i这种情况更有用,虽然实际代码里面确实很少出现. 面对象像三大特点不 ...

  4. Maven(1)-安装和配置

    Maven(1)-安装和配置 一.本机必须安装好Jdk 二 .maven下载 http://maven.apache.org/download.cgi ,下载后把maven-bin解压到自己的目录即可 ...

  5. FileUpload上传与下载

    后台代码: public string connstr = "server=128.1.3.113;database=test;uid=sa;pwd=pass"; protecte ...

  6. 盘点十大最流行的Linux服务器发行版

    随着Linux不断发展,Linux所支持的文件系统类型也在迅速扩充.很多的数据中心服务器上都运行着Linux,可以节省大量的许可证费用及维护费用.但伴随着Linux新版本的发行,其中每一个不同版本的L ...

  7. winform开发中绑定combox到枚举

    开发中需要根据下拉框的选择处理一些业务逻辑,使用ID值或Text值都不利于代码维护,所以可以写个扩展方法绑定到枚举上. public static class Extensions { /// < ...

  8. hduacm 5255

    http://acm.hdu.edu.cn/showproblem.php?pid=5255 枚举a和c  求解b #include <cstdio> #include <cstri ...

  9. spring任务计划

    小组 第一次小组会议结果 贾川和刘三龙负责这些任务: 1:4.11 搭配开发必要的环境,vs2010 2:4.12学习windows界面开发的基本知识 3:4.13-4.15 和小组成员讨论软件界面的 ...

  10. ASP.NET MVC 基于角色的权限控制系统的示例教程

    上一次在 .NET MVC 用户权限管理示例教程中讲解了ASP.NET MVC 通过AuthorizeAttribute类的OnAuthorization方法讲解了粗粒度控制权限的方法,接下来讲解基于 ...