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之前做的一系列的准备工作,最主要的操作包括:
    1. 就是设置每个ItemContainer的ContentTemplate,这里也说明ItemContainer一般都为ContentControl,否则ItemsControl的ItemTemplate设置就没有任何意义
    2. 如果ItemsControl设置了DisplayMemberPath的话,ItemsControl就生成一个DisplayMemberTemplate的内部类,这个类本质上是一个DataTemplate,从DataTemplate继承,其使用TextBlock绑定DisplayMemberPath指定的属性路径
    3. 使用ItemsControl的ItemContainerStyle设置了ItemContainer的Style

关于这个方法需要说明的几点是:

      1. ItemTemplate和DisplayMemberPath不能同时设置,否则会抛出异常
      2. 如果自定义的ItemsControl在显示Item时出现问题的话,就检查是否正确的重写了该方法,比如是否覆盖了base的实现,而且还没有正确设置ItemTemplate、ItemContainer这些属性
  • ClearContainerForItemOverride,这个方法在ItemsControl中Item被从界面显式中移除时执行,用来清理ItemContainer使用的资源,可以在这里解注册ItemContainer注册的事件等操作

未完待续…………………

Silverlight ItemsControl详细解析+解惑的更多相关文章

  1. java类生命周期详细解析

    (一)详解java类的生命周期 引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前 ...

  2. springmvc 项目完整示例06 日志–log4j 参数详细解析 log4j如何配置

    Log4j由三个重要的组件构成: 日志信息的优先级 日志信息的输出目的地 日志信息的输出格式 日志信息的优先级从高到低有ERROR.WARN. INFO.DEBUG,分别用来指定这条日志信息的重要程度 ...

  3. include_path详细解析

    include_path详细解析     原文地址:http://www.laruence.com/2010/05/04/1450.html 1.php默认的包含路径为 .;C:\php\pear 即 ...

  4. Intent的详细解析以及用法

    Intent的详细解析以及用法      Android的四大组件分别为Activity .Service.BroadcastReceiver(广播接收器).ContentProvider(内容提供者 ...

  5. C++多态的实现及原理详细解析

    C++多态的实现及原理详细解析 作者: 字体:[增加 减小] 类型:转载   C++的多态性用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型 ...

  6. 对MySQL DELETE语法的详细解析

    以下的文章主要描述的是MySQL DELETE语法的详细解析,首先我们是从单表语法与多表语法的示例开始的,假如你对MySQL DELETE语法的相关内容十分感兴趣的话,你就可以浏览以下的文章对其有个更 ...

  7. 转:二十一、详细解析Java中抽象类和接口的区别

    转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...

  8. 单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式

    单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式     一 表结构如下:  万行 CREATE TABLE t_audit_operate_log (  Fid b ...

  9. 在PHP中使用CURL,“撩”服务器只需几行——php curl详细解析和常见大坑

    在PHP中使用CURL,"撩"服务器只需几行--php curl详细解析和常见大坑 七夕啦,作为开发,妹子没得撩就"撩"下服务器吧,妹子有得撩的同学那就左拥妹子 ...

随机推荐

  1. Android菜鸟的成长笔记(23)——获取网络和SIM卡信息

    TelephonyManager是一个管理手机通话状态.电话网络信息的服务类,该类提供了大量的getXxx()方法来获取电话网络的相关信息.这些信息包括设备编号.软件版本.网络运营商代号.网络运营商名 ...

  2. 【21.67%】【codeforces 727B】Bill Total Value

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  3. 漫步Unity3D(一)

    前言 采用Unity它已经将近半年的时间,虽然项目仅仅是一个半成品.但Unity熟几乎相同的游戏.在这里,在使用过程中遇到的问题,再梳.不涉及过于详细的功能和代码.但是,假设他们将参与开发一个在线知识 ...

  4. WPF去除边框的方法

    原文:WPF去除边框的方法 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yangsen600/article/details/81978125 W ...

  5. C# 异步和多线程

    C#中 Thread,Task,Async/Await,IAsyncResult 的那些事儿! 说起异步,Thread,Task,async/await,IAsyncResult 这些东西肯定是绕不开 ...

  6. ASP.NET Core 使用 EF 框架查询数据 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 使用 EF 框架查询数据 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 使用 EF 框架查询数据 上一章节我们学习了如何设置 ...

  7. python中string的操作函数

    在python有各种各样的string操作函数.在历史上string类在python中经历了一段轮回的历史.在最开始的时候,python有一个专门的string的module,要使用string的方法 ...

  8. python 教程 第二十一章、 扩展Python

    第二十一章. 扩展Python /* D:\Python27\Lib\Extest-1.0\Extest2.c */ #include <stdio.h> #include <std ...

  9. UVALive 6485 Electric Car Rally (BFS,PQ)

    https://icpcarchive.ecs.baylor.edu/index.php? option=com_onlinejudge&Itemid=8&page=show_prob ...

  10. qt4.8.7 源码在win7+vs2010环境的x64编译(qt 64位)

    由于qt官网上,没有直接提供x64的安装包,但由于项目需要x64的qt,所以,小编不得不下载qt的源码,经历了一次长达约4个小时的编译过程.今年国庆7天,就遭这事上了,哈哈~~~ 几个下载链接: qt ...