Silverlight ItemsControl详细解析+解惑
Silverlight最强大的地方就在于定义控件了,Silverlight提供了非常灵活和高效的控件定义方式,几乎可以实现任何复杂的控件实现,对于快速开发应用程序有着重要的意义。在Silverlight中一般将控件分为两大类:
- 非ItemsControl,像TextBox、Button等,表示单一的一个控件,这样的控件大部分开发者都可以很好的理解和掌握
- ItemsControl,像ListBox、ComboBox、TreeView等,用来承载多个控件,这样的控件给很多开发者带来困惑,不是很好理解,尤其是在定义ItemsControl控件时。希望通过本文能够让所有还对ItemsControl有困惑的开发者,能够更清晰的认识ItemsControl
那些困惑
- 现在有如下的需求:我想添加如下的一个集合控件,期望选中项出现三角箭头的提示,应该是在DataTemplate中定义,还是在ListBoxItem中Template定义?

- 下面的代码是如何实现多级数据绑定的,明明只使用了一级的DataTemplate?
<sdk:HierarchicalDataTemplate x:Key="DataTemplate1" ItemsSource="{Binding SubFolders}">
<Grid>
<TextBlock TextWrapping="Wrap" Text="{Binding FolderName}"/>
</Grid>
</sdk:HierarchicalDataTemplate>
ItemsControl剖析
这里着重介绍其中几个关键方法,透彻理解这些方法是使用和定义ItemsControl的关键:
- IsItemItsOwnContainerOverride,ItemsControl会遍历Items集合,对每个item调用该方法(注:对于设置ItemsSource的话,最终都会将ItemsSource中的每一项都添加到Items集合中),如果item类型和ItemsControl的每个Item的Container类型不匹配,返回false,否则返回true,如果要实现自定义的集合控件,这里就是该集合控件需要的ItemContainer类型。下图是ListBox中该方法的实现:

- GetContainerForItemOverride,如果IsItemItsOwnContainerOverride返回false,就执行该方法,这个方法主要是为ItemsControl的每个Item返回一个ItemContainer对象
- PrepareContainerForItemOverride,这个方法在准备显示每个Item之前做的一系列的准备工作,最主要的操作包括:
- 就是设置每个ItemContainer的ContentTemplate,这里也说明ItemContainer一般都为ContentControl,否则ItemsControl的ItemTemplate设置就没有任何意义
- 如果ItemsControl设置了DisplayMemberPath的话,ItemsControl就生成一个DisplayMemberTemplate的内部类,这个类本质上是一个DataTemplate,从DataTemplate继承,其使用TextBlock绑定DisplayMemberPath指定的属性路径
- 使用ItemsControl的ItemContainerStyle设置了ItemContainer的Style
关于这个方法需要说明的几点是:
- ItemTemplate和DisplayMemberPath不能同时设置,否则会抛出异常
- 如果自定义的ItemsControl在显示Item时出现问题的话,就检查是否正确的重写了该方法,比如是否覆盖了base的实现,而且还没有正确设置ItemTemplate、ItemContainer这些属性
- ClearContainerForItemOverride,这个方法在ItemsControl中Item被从界面显式中移除时执行,用来清理ItemContainer使用的资源,可以在这里解注册ItemContainer注册的事件等操作
未完待续…………………
Silverlight ItemsControl详细解析+解惑的更多相关文章
- java类生命周期详细解析
(一)详解java类的生命周期 引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前 ...
- springmvc 项目完整示例06 日志–log4j 参数详细解析 log4j如何配置
Log4j由三个重要的组件构成: 日志信息的优先级 日志信息的输出目的地 日志信息的输出格式 日志信息的优先级从高到低有ERROR.WARN. INFO.DEBUG,分别用来指定这条日志信息的重要程度 ...
- include_path详细解析
include_path详细解析 原文地址:http://www.laruence.com/2010/05/04/1450.html 1.php默认的包含路径为 .;C:\php\pear 即 ...
- Intent的详细解析以及用法
Intent的详细解析以及用法 Android的四大组件分别为Activity .Service.BroadcastReceiver(广播接收器).ContentProvider(内容提供者 ...
- C++多态的实现及原理详细解析
C++多态的实现及原理详细解析 作者: 字体:[增加 减小] 类型:转载 C++的多态性用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型 ...
- 对MySQL DELETE语法的详细解析
以下的文章主要描述的是MySQL DELETE语法的详细解析,首先我们是从单表语法与多表语法的示例开始的,假如你对MySQL DELETE语法的相关内容十分感兴趣的话,你就可以浏览以下的文章对其有个更 ...
- 转:二十一、详细解析Java中抽象类和接口的区别
转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...
- 单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式
单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式 一 表结构如下: 万行 CREATE TABLE t_audit_operate_log ( Fid b ...
- 在PHP中使用CURL,“撩”服务器只需几行——php curl详细解析和常见大坑
在PHP中使用CURL,"撩"服务器只需几行--php curl详细解析和常见大坑 七夕啦,作为开发,妹子没得撩就"撩"下服务器吧,妹子有得撩的同学那就左拥妹子 ...
随机推荐
- ubuntu 下 caffe 的安装
官方下载说明:Caffe | Installation: Ubuntu 在 ubuntu 的一些较新版本中(14.04 以上),caffe 的所有依赖包都可以使用 apt-get 大法搞定. 1. 依 ...
- Indexing Sensor Data
In particular embodiments, a method includes, from an indexer in a sensor network, accessing a set o ...
- git版本管理与github
1.下载并安装好git 里面有几个.exe的文件,需要用到的就是git-bash.exe 2.把git和github连接 1.打开github网站,点击最右上角的图标,点击setti ...
- Delphi png、bmp、gif等图片格式转换成jpg
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- DDD实战8_2 利用Unity依赖注入,实现接口对应实现类的可配置
1.在Util类库下新建DIService类 /// <summary> /// 创建一个类,对应在配置文件中配置的DIServices里面的对象的 key /// </summar ...
- .net core下,Ocelot网关与Spring Cloud Gateway网关的对比测试
有感于 myzony 发布的 针对 Ocelot 网关的性能测试 ,并且公司下一步也需要对.net和java的应用做一定的整合,于是对Ocelot网关.Spring Cloud Gateway网关做个 ...
- 给WPF示例图形加上方便查看大小的格子之完善版本
原文:给WPF示例图形加上方便查看大小的格子之完善版本 去年10月份, 我曾写过一篇"给WPF示例图形加上方便查看大小的格子"的BLOG(http://blog.csdn.net/ ...
- Leetcode 268 Missing Number 位运算
题意:先将0, 1, 2, ..., n放入数组,然后去掉其中一个值,找到那个值. 这题与singe number 是一个类型,变形的地方就是首先需要将0, 1, 2, ..., n再次放入这个数组, ...
- Viewport3D中的摄像机(二、摄像机动作)
原文:Viewport3D中的摄像机(二.摄像机动作) 前文介绍了Viewport3D中的两种摄像机:OrthographicCamera和PerspectiveCamera.在3D场景里漫游,最主要 ...
- C++ Primer 学习笔记_104_特殊工具与技术 --嵌套类
特殊工具与技术 --嵌套类 能够在还有一个类内部(与后面所讲述的局部类不同,嵌套类是在类内部)定义一个类,这种类是嵌套类,也称为嵌套类型.嵌套类最经常使用于定义运行类. 嵌套类是独立的类,基本上与它们 ...