本文结合模板的应用初步介绍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控件(涉及模板、查找子控件)的更多相关文章

  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. eclipse 项目修改和更新项目,回退版本,解决分支的冲突的办法

    一个关于git的图 1.我在github建立了3个分支. 2.把其中一个分支拉到本地. 项目修改提交到远程库 3.修改完代码以后commit项目,点击项目右击->team->commit ...

  2. BPMX3模拟登录

    实现功能只需要输入一个帐号即可登录系统. 需要实现上面的功能需要: 1.编辑imitate.jsp页面 <%@page import="com.hotent.core.util.Con ...

  3. word 转 PDF时报错

    利用微软自带的com组件,把word转化成Pdf,利用vs2012调试时没有问题,但是发布到IIS时出错,错误为: 检索 COM 类工厂中 CLSID 为 {} 的组件时失败,原因是出现以下错误: 8 ...

  4. 喜讯!Ubuntu 16.10(Yakkety Yak) Final Beta发布喽!!!

    上月三十日,代号为"Yakkety Yak"的Ubuntu 16.10发行版本的Final Beta正式上线.Canonical的开发者Steve Langasek说道:" ...

  5. 导航栏视图设置 tabbleView 是设置总背景图

    //导航栏视图设置 tabbleView 是设置总背景图 //默认的时白色半透明(有点灰的感觉), UIBarStyleBlack,UIBarStyleBlackTranslucent ,UIBarS ...

  6. 转: Oracle中的物化视图

    物化视图创建语法:CREATE MATERIALIZED VIEW <schema.name>PCTFREE <integer>--存储参数PCTUSED <intege ...

  7. IT公司100题-7-判断两个链表是否相交

    问题:有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环.1.如何判断一个链表是不是这类链表? 问题扩展:1.如果链表可能有环呢?2.如果需 ...

  8. WP8.1 Study2:MapControl控件的应用

    总的界面布局如下:

  9. 初识VBS

    做了测试快一年了吧,迫于无奈,要学习自动化的只是,首先想到了QTP,但是QTP的脚本是VBS,所以必须要会VBS. VBS其实就是一门计算机编程语言,但是缺少计算机程序语言中的部分要素,对于事件的描述 ...

  10. ssm开发的一点小技巧

    一般使用反转工作生成基础bean如Items然后我们使用的实体类一般是基础bean的拓展类ItemsCustomer,继承自基础类,这个是为了方便对于表字段的更改生成的bean影响减低我们查询一般是使 ...