一. 摘要
首先圣殿骑士很高兴这个系列能得到大家的关注和支持,这个系列从七月份开始到现在才第七篇,上一篇发布是在8月2日,掐指一算有二十多天没有继 续更新了,最主要原因一来是想把它写好,二来是因为最近几个月在筹备“云计算之旅”系列,所以一再推迟了发布进度。之前一直都没有想过要录制视频,主要的 原因还是怕自己知识有限,从而误导他人,所以前几次浪曦和51CTO邀请录制视频,我都以工作忙、公司内部培训需要时间和自己有待提高等理由委婉的拒绝 了,说实在的,自己也知道自己还有很多地方有待提高,还需要向各位学习,所以这几年都会一直努力,相信总有一天自己头上也会长出两只角的。录制视频的事也 就这样不了了之了,直到前一段时间MSDN WebCast的再三邀请,我才决定努力试一试,同时也希望各位能够支持,现在都把社区当成自己的坚强后盾了,所以我打算先以博客的形式发布,这样就可以 先和大家一起讨论,纠正自己的某些错误认识,这样在录制视频的时候就不会误导他人了。
前几篇我们讲了WPF的一些基本知识,但是始终没有接触最核心的概念,那么从这篇文章开始的下面几篇文章中,我们会分别深入讨论一下依赖属性、 路由事件、命令和绑定等相关概念,希望这几篇文章对大家能有所帮助。由于自己才疏学浅且是对这些技术的使用总结和心得体会,错误之处在所难免,怀着技术交 流的心态,在这里发表出来,所以也希望大家能够多多指点,这样在使一部分人受益的同时也能纠正我的错误观点,以便和各位共同提高。
这篇文章比较多,在开篇之前我们会先介绍比本篇更重要的一些东西,然后插播一段“云计算之旅”的广告(
PHP?refimg=" + this.src)" src="http://img.jb51.cc/vcimg/static/loading.png" alt="" src="http://www.zu14.cn/coolemotion/emotions/zz_1.gif">
这里广告费比较贵哟!),作为最近几个月执着研究的东西,终于可以和大家见面了,希望自己能从实践中深入浅出的讲明白。在前面的两个内容之后我们正式进入 本篇的主题——依赖属性。依赖属性是WPF的核心概念,所以我们花费了大量的时间和篇幅进行论述,首先从依赖属性基本介绍讲起,然后过渡到依赖属性的优先 级、附加属性、只读依赖属性、依赖属性元数据、依赖属性回调、验证及强制值、依赖属性监听、代码段(自动生成) 等相关知识,最后我们会模拟一个WPF依赖属性的实现,来看看它里面的内部究竟是怎样处理的,这样就可以帮助我们更好的认清它的本质,出现问题的时候我们 也可以根据原理快速找到原因了。二. 本文提纲
· 1.摘要
· 2.本文提纲
· 3.比这篇文章更重要的东西
· 4.云计算广告插播
· 5.依赖属性基本介绍
· 6.依赖属性的优先级
· 7.依赖属性的继承
· 8.只读依赖属性
· 9.附加属性
· 10.清除本地值
· 11.依赖属性元数据
· 12.依赖属性回调、验证及强制值
· 13.依赖属性监听
· 15.模拟依赖属性实现
· 16.本文总结
· 17.相关代码下载
· 18.系列进度
三. 比这篇文章更重要的东西
在讲这篇文章之前,我们先来聊一点更重要的东西,正所谓“授人与鱼不如授人以渔”,那么我们这个“渔”究竟是什么呢?大家做软件也有不少年了, 对自己擅长的一门或多门技术都有自己的经验和心得,但总的来说可以分为向内和向外以及扩展三个方面(这里只针对.NET平台):
(一)向外:
会使用ASP.NET、WinForm、ASP.NET MVC、WPF、Silverlight、WF、WCF等技术,在用这些技术做项目的同时积累了较丰富的经验,那么大家就可以形成自己的一套开发知识库, 知道这些技术怎么能快速搭建企业所需要的应用、知道这些技术在使用中会出现什么样的问题以及如何解决。那么在这个时候你就可能已经在团队中起到比较核心的 作用,如果项目经理给你一个任务,你也可以很轻松且高效的胜任,同时在项目当中由于你也比较清楚业务逻辑,所以当机会来临的时候,你很快会成为团队的骨 干,逐渐你就会带几个初级一点的工程师一起做项目;如果你不喜欢带团队,你就会成为资深的高级开发或者架构师。那么在向外方面我个人认为最重要的是积累经 验,对常见的应用要比较熟悉且有自己总结的一套开发库——比如对普通的网站、电子商务系统、ERP、OA、客户端应用等等有比较丰富的经验。
(二)向内:
在前面你使用了这些技术开发项目之后,你会遇到很多问题,为了解决这些问题,你会逐渐研究一些比较底层次的东西。比如对于ASP.NET,你会 逐渐的去深入理解ASP.NET的整个处理过程、页面的生命周期、自定义控件的开发等等,由于自己最初是由C、C++、Java这样过渡到.NET的,所 以对一些细节总喜欢钻牛角尖,这也浪费了不少时间,但同时也得到了很多意外之喜。
对于C#语言上,你也会逐渐去刨根问底,想看看这些语法糖背后到底隐藏着什么秘密,很多对.NET技术比较痴迷的人都会选择对C# 1.0 语言通过IL代码来深层次认识,然后对C#2.0、C#3.0、C#4.0都编译为C# 1.0 来学习,这样他们就能认识到语言的内部到底是怎么执行的,正所谓知道的同时也知道其所以然。
对于WF,你不仅要知道各 Activity的使用,你也得知道其内部的原理,比如WF 内部就是依靠依赖属性来在工作流中的各 Activity 间传递属性值的,如果你细心,你还原WF的依赖属性源码,你会发现它和WPF、Silverlight中的依赖属性大同小异,原理基本一样、只是针对特定 技术进行了适当的调整。
对于数据底层操作也一样,不管你是用的拼接sql、存储过程、IBATIS.NET、Nhibernate,Active Record,Linq to sql、Entity framework还是自己开发的ORM组件,你得明白它内部的原理,你要知道这些开源的代码还是很值得研究的,我的经验是先熟练使用这些功能,然后再剖 析它的源码,然后自己写一套自己的框架,现在我也在精简自己的ORM框架,因为之前把重点放在了实现尽可能多的功能,所以对性能等细节没有做过多优化,后 面也会向大家慢慢学习。
对WPF和Silverlight一样,你不仅要知道怎么用这些技术,你要知道它的原理,比如对依赖属性,你知道它的内部原理,就可以对平时出现的 诸如我设置的值怎么没有起作用、我Binding的元素怎么没有出现等等问题; 对路由事件,你也会经常遇到我的事件怎么没有执行、我的自定义控件事件怎么处理不对、路由传递怎么没有起作用等等,这个时候你如果深入理解了路由事件的内 部处理,这些问题就迎刃而解了;对WPF和Silverlight新多出来的命令特性,大家很多时候也是比较疑惑,也会遇到命令失效等等问题,其实如果你 深入的了解了它的原理,你就会知道,它其实在内部也是事件,只不过微软在里面做了很多封装而已;对Binding就更是如此,我们也不想在这篇文章谈开 去,毕竟在下面的几篇文章会详细的对这些技术进行涉及。
(三)扩展:
通过前面的向内和向外的修炼以后,接下来要做的就是不断实践,不断总结经验,在这个过程中更重要的是要懂得分享,有分享才会使自己和他人共同提 高,有分享才能让自己摆脱狂妄的井底之蛙思想,还记得自己刚做技术的一两年里,天天喜欢提及大型架构、大型数据处理、操作系统底层代码如何如何,甚至把 AOP、IOC、SSH、OO及设计模式、SOA等词语时常挂在嘴边,生怕别人不知道自己不懂。但随着自己技术实质上的提高以及经验的积累,自己也就逐渐 成熟起来,对这些技术逐渐深入理解且理解了其内部实现原理,这样反而自己变得谦虚起来了,对之前的那些思想感到无比的羞愧。同时也明白自己在慢慢成长了, 现在都习惯戏称自己为打杂工,其实更多时候用打字员会合理一些,所以希望大家能多多指教,这样我才能更快地摆脱打字员的生活。我在这里也对扩展做一点小的 总结:
记录学习:这是学习很重要的一步,你不一定要写技术博客,你也可以做一些例子来记录,你也可以在学习之后写一个总结,毕竟人的精力十分有限,在很多时候,它并不能像硬盘一样存储起来就不会丢失,更多的时候它更像一块内存。
同道交流:在这一层里我觉得最重要的就是和一些技术较好的人成为朋友,和他们经常探讨一些技术,这样可以缩短学 习的周期,同时也能快速的解决问题,毕竟人的精力十分有限,你没有遇到过的问题,说不定其他人遇到过。在这方面自己也体会颇深,也很感谢之前几个公司及现 在公司的同事、社区朋友以及一些志同道合之士,感谢你们的指点,没有你们的指点,我也不可能从小鸟进化成逐鹿程序界的菜鸟,我也为自己能成为一只老菜鸟感 到自豪!
少考证、多务实:在扩展的这一层里,我们要谨记不要为了考证而去考证,那样是没有任何实际作用的。对MVP也一 样,一切顺其自然为好,记得大学时候身边就有人连续四次荣获MVP称号,这叫我在当时是相当的佩服,在佩服之余我们要切记务实,没有务实的东西都是很虚拟 飘渺的。还记得自己当初在大学里面受到考证风气的影响,神经兮兮的去考过了什么国家计算机四级和MCP等一大堆证件,后来到公司面试兴高采烈拿着20多张 证书,才知道那些东西根本就没有什么价值,反而让自己去学习了最不喜欢的技术,同时也给自己挂上了考证族的名号。所以后来总结就是劳民伤财、徒添伤悲!
技术分享:在自己公司及其他公司进行一些技术培训或者讨论,其实重要的不是什么荣誉,而是在把这个培训看成是一 些技术交流和分享,因为在这个过程中,你可能会重新认识你所掌握的技术、你可能会遇到一些志同道合的人、你可能会在分享过程中纠正以前的错误认识、你可能 会在各方面得到提高从而完善自己的知识体系,但是最重要的是你要认真对待每一次培训,知之为知之不知为不知,不要不能教导他人反而误导了他人。记得有一次 在公司培训OO与设计模式,我知道这个专题想在一下午的时间把它讲清楚是非常困难的,这个不像之后培训的WPF、WCF和Silverlight那么单 纯,并且每个人的基础都不一样,当中有还没有毕业的实习生、刚毕业不久的毕业生、工作了数年的工程师及技术大牛们,所以如何把这些知识很好的插入到每个人 的知识树上面成了我考虑的重点。同时我的心里也比较矛盾,一方面希望参加培训的同事多一些,另一方面希望人越少越好。前者则是按照常理来考虑的,毕竟培训 者都希望自己培训,越受欢迎越好,这样才能使自己的思想得到更多人的认可,自己也能实现分享知识的目的。后者则是担心怕讲不好,少一点人就少一点罪过。可 是恰巧这一次是历次培训中最多的一次,来参加培训的同事有一百多人,不过幸好由于会议室坐不下,才分成了两批,这样就可以让我具备了更充分的时间和更好的 心态。总之培训是向内和向外的提炼与升华,正所谓“自己理解的知识未必能使人家理解”,这不仅考验的是技术,还考验了一个人的综合能力。
(四)结论:
前面从向内和向外以及扩展三个方面进行了简单阐述,用一句话概括就是:向内深不可测、向外漫无边际、扩展才能超越极限。由于这里只是对本文及下 面的三篇文章做一些铺垫工作,所以我们也不细细分解,那么我也得稍微推荐一点资料才对得起大家:第一还是研究微软的类库,对我们常见的应用进行研究,可以 结合Reflector+VS调试内部代码功能一起研究(IL能帮我们看清楚一些内部原理,但是不推荐细究,因为它会浪费我们很多时间,毕竟是微软搞出来 的这么一套东西,说不定微软哪天就换了)。其次就是研究MONO源码(www.mono-project.com),这个是个非常好的东西,对.NET的功能大部分都进行了实现,我之前研究它不是因为它的跨平台,是感兴趣它的源码,大家也可以在线查看它的源码(www.java2s.com),说到java2s这个网站,也是我平时去得比较多的网站,因为它比较全面和方便,同时也会给我们带来意想不到的收获。再其次就是研究一些开源的框架和项目,比如pet shop 4.0(http://software.informer.com/getfree-net-pet-shop-4.0-download/)、BlogEngine.NET(http://www.dotnetblogengine.net/)、Spring.NET(http://www.springframework.net/)、Castle(http://www.castleproject.org)、log4net(http://logging.apache.org/log4net/)、NHibernate(http://www.hibernate.org/343.html)、iBATIS.NET(http://ibatis.apache.org)、Caliburn(http://caliburn.codeplex.com/)、MVVM Light Toolkit(http://mvvmlight.codeplex.com/)、Prism(http://compositewpf.codeplex.com/)等等。这里要注意的是:在研究的过程中一定要先熟悉功能,再研究它内部的源码和实现,然后再创造出自己的框架。这样才能激发我们研究的欲望,才会产生作用和反作用力,从而才会使我们真正受益。
四. 云计算广告插播
由于这段时间白天要研究云计算专题(公司项目原因,最主要还是自己的兴趣使然),晚上和闲暇时间又要写WPF,所以感觉有点心猿意马。原打算写 完WPF这个系列以后才继续”云计算之旅“这个系列,但是经过慎重的思考,同时也考虑到录制MSDN WebCast视频,所以决定两个系列同时进行,经过几个月的筹备(期间包括折腾公司的云计算项目、研究相关云计算的电子书、国外技术视频和国外各技术社 区和博客等),自己也颇有收获。期间最重要的还是自己写例子,写完了以后再分析它的原理直至最后总结,这样才能把它变成自己的东西,现在回过头来感觉云计 算终于在自己心目中走下了神坛,逐渐揭开了那一层神秘面纱,所以才有下面这个系列的分享,也希望大家能给出建议,从而达到技术交流、共同提高的目的。
云计算之旅1—开篇有益
云计算之旅2—云计算总览
云计算之旅3—云计算提供商综合对比
云计算之旅4—Windows Azure总览
云计算之旅5—第一个Windows Azure程序
云计算之旅6—剖析Windows Azure程序内部原理
云计算之旅7—ASP.NET Web Role
云计算之旅8—ASP.NET MVC Web Role
云计算之旅9—WCF Service Web Role
云计算之旅10—Work Role Castle
云计算之旅11—CGI Web Role
云计算之旅12—云存储之Blob
云计算之旅13—云存储之Table
云计算之旅14—云存储之Quee
云计算之旅15—云存储之Dive
云计算之旅16—sql Azure(一)
云计算之旅17—sql Azure(二)
云计算之旅18—sql Azure(三)
云计算之旅19—AppFabric(一)
云计算之旅20—AppFabric(二)
云计算之旅21—AppFabric(三)
云计算之旅22—云平台安全问题
云计算之旅23—老技术兼容问题
云计算之旅24—ASP.NET+sql项目移植到云平台
云计算之旅25—WinForm/WPF项目移植到云平台(云/端模式)
云计算之旅26—ASP.NET+Silverlight项目移植到云平台
云计算之旅27—Amazon云计算
云计算之旅28—Google云计算
云计算之旅29—SalesForce云计算
云计算之旅30—云计算开发总结
上面的分类是按照最近学习的总结归类的,在这几个月中也先后写了一些文章和代码示例,同时有些知识没有罗列上去,在后面可能会有一些小的修改。 总之,我们坚决抵制”忽悠“,争取以实际代码说话,在此过程中希望大家能够积极踊跃的加入进来,如果有什么不对的地方,也希望向大家学习,最重要的是大家 有所收获就好!