WPF基础到企业应用系列7——深入剖析依赖属性(WPF/Silverlight核
首先圣殿骑士很高兴这个系列能得到大家的关注和支持这个系列从七月份开始到现在才第七篇上一篇发布是在8月2日掐指一算有二十多天没有继续更新了最主要原因一来是想把它写好二来是因为最近几个月在筹备“云计算之旅”系列所以一再推迟了发布进度。之前一直都没有想过要录制视频主要的原因还是怕自己知识有限从而误导他人所以前几次浪曦和51CTO邀请录制视频我都以工作忙、公司内部培训需要时间和自己有待提高等理由委婉的拒绝了说实在的自己也知道自己还有很多地方有待提高还需要向各位学习所以这几年都会一直努力相信总有一天自己头上也会长出两只角的。录制视频的事也就这样不了了之了直到前一段时间MSDN WebCast的再三邀请我才决定努力试一试同时也希望各位能够支持现在都把社区当成自己的坚强后盾了所以我打算先以博客的形式发布这样就可以先和大家一起讨论纠正自己的某些错误认识这样在录制视频的时候就不会误导他人了。前几篇我们讲了WPF的一些基本知识但是始终没有接触最核心的概念那么从这篇文章开始的下面几篇文章中我们会分别深入讨论一下依赖属性、路由事件、命令和绑定等相关概念希望这几篇文章对大家能有所帮助。由于自己才疏学浅且是对这些技术的使用总结和心得体会错误之处在所难免怀着技术交流的心态在这里发表出来所以也希望大家能够多多指点这样在使一部分人受益的同时也能纠正我的错误观点以便和各位共同提高。这篇文章比较多在开篇之前我们会先介绍比本篇更重要的一些东西然后插播一段“云计算之旅”的广告这里广告费比较贵哟作为最近几个月执着研究的东西终于可以和大家见面了希望自己能从实践中深入浅出的讲明白。在前面的两个内容之后我们正式进入本篇的主题——依赖属性。依赖属性是WPF的核心概念所以我们花费了大量的时间和篇幅进行论述首先从依赖属性基本介绍讲起然后过渡到依赖属性的优先级、附加属性、只读依赖属性、依赖属性元数据、依赖属性回调、验证及强制值、依赖属性监听、代码段(自动生成) 等相关知识最后我们会模拟一个WPF依赖属性的实现来看看它里面的内部究竟是怎样处理的这样就可以帮助我们更好的认清它的本质出现问题的时候我们也可以根据原理快速找到原因了。二. 本文提纲· 1.摘要· 2.本文提纲· 3.比这篇文章更重要的东西· 4.云计算广告插播· 5.依赖属性基本介绍· 6.依赖属性的优先级· 7.依赖属性的继承· 8.只读依赖属性· 9.附加属性· 10.清除本地值· 11.依赖属性元数据· 12.依赖属性回调、验证及强制值· 13.依赖属性监听· 14.代码段(自动生成)· 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、NhibernateActive RecordLinq 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那么单纯并且每个人的基础都不一样当中有还没有毕业的实习生、刚毕业不久的毕业生、工作了数年的工程师及技术大牛们所以如何把这些知识很好的插入到每个人的知识树上面成了我考虑的重点。同时我的心里也比较矛盾一方面希望参加培训的同事多一些另一方面希望人越少越好。前者则是按照常理来考虑的毕竟培训者都希望自己培训越受欢迎越好这样才能使自己的思想得到更多人的认可自己也能实现分享知识的目的。后者则是担心怕讲不好少一点人就少一点罪过。可是恰巧这一次是历次培训中最多的一次来参加培训的同事有一百多人不过幸好由于会议室坐不下才分成了两批这样就可以让我具备了更充分的时间和更好的心态。总之培训是向内和向外的提炼与升华正所谓“自己理解的知识未必能使人家理解”这不仅考验的是技术还考验了一个人的综合能力。