分析扩展类Message.Attach前我们现以标准MVVM的形式看下,通过比较才会知道CM带来的方便.下面用的例子都为CM源码中找出来的代码段.
- cal:Message.Attach="DeactivateItem($dataContext, 'true')"
- cal:Message.Attach="[Key Enter] = [EnterPressed]"
- cal:Message.Attach="[Event MouseDoubleClick] = [Action ShowView]; [Event Click] = [Action ShowView]"
按顺序对应的1-3个
功能大致实现2\3功能由于没有参数传入.功能都完全成功以MVVM写回出来.
功能1的参数有两个CallMethodAction这个类只能传入一个参数,如果不自己写方法扩展的话功能1最多就只能写到DeactivateItem($dataContext)这样子而以,想要有更多的参数就不行了.如果想要当前事件的EvnetArge作为参数与是很麻烦的.
CM可以用一行代码等于传统的几行代码.存在多个这样子的功能时,代码效率高看起来也直观.俗话说的好不怕不识货就怕货比货.现在就让我们直接分析这简单的一行代码是怎么把标准MVVM这多行代码功能集成.
从CM的实例代码中.从Message.Attach这个扩展方法作为分析的切入点.Message类上注册AttachProperty (public)\HandlerProperty (private)\ MessageTriggersProperty (internal)这几个扩展方法的注册信息.从分析\排查\访问形式等方式当前是直接锁定AttachProperty.
从代码中看以Get\Set没有什么特别.都是标准的取值付值.看到注册扩展信息的信息上在属性改变时执行了OnAttachChanged方法.让我们看看这个方法又包含了什么.
通过OnAttachChanged方法知道,红是区域就是给控件的触发器集合做绑定,其它只是清理和添加集合.到分析下红色区域的代码让我们更加接近真相吧.
Parser类中的Parse方法让我知道解释命令字符串的规则也让我们粗略知道通过解释命令字符串创建对应的触发事件与对应的绑定函数方法.这样大致原理都已经出来了.那又是什么具体的创建触发器的呢,那细节上还有什么我们不为人知的关键点呢.你可要记得triggerPlusMessage数组是中第一个元素可是有为空情况的.
不为空的情况好处理嘛.但为空时怎么能确定默认要绑定的事件呢,看ConventionManager.GetElementConvention这个地方有猫腻.等等好像还有个问题,在CM样例程序中不是有个叫[Key Enter] = [EnterPressed]的代码行的嘛.从这看不是没有对Key的处理嘛.先不用急你可以看下CreateTrigger可是个委托还是个公开可修改的.下次让我们了解CM是怎么进行Evnet之外的处理.现在还是把正常流程分析完成.
我的天啊ActionMessage是什么东东,接口IHaveParameters又是什么东东啊?不是这样子玩我吧,看来这分解还没成功不过还好是把基本思路走通了. SplitParameters这个方法就不细说了简单一名就是把参数字符串解释成对应的数组.不过有点不太明白框架这可是自带侵害功能的为什么还要自己写一个呢.不知道你还刻上面也有个Split方法.这就更是可以用框架自带的方法了.这也是我比较不明白地方之一.难度自己写的比框架自带的性能要高??这点我就没有去验证了好像有点走题了.这些小问题还是别理先而ActionMessage这类说明来也比较复杂还是等下次再细说吧还是跳到重点怎么绑定对应的参数.
创建Binding中由于环境不同出现了#if的环境,我把非WPF的情况都收起来只看WPF下的代码情况.我的天天怎么还有BindingScope, ConventionManager,View.看来CM为了这个看起来简单的功能还做了不少的功夫啊.还好功能都基本分析出来了.
下次自己写控件时用命令字符串绑定时我可知道怎么去写了,你理解没有???那些用到没有细讲的类还知道是什么吧???已经细讲的类你有没有发现这个功能都分析完了但是还有没用到的呢???还是列出清单那可是有46文件的.
已经用到类 |
是否分析 |
是否完全分析 |
备注 |
Message |
是 |
||
Parser |
是 |
是 |
|
ConventionManager |
|||
ActionMessage |
|||
IHaveParameters |
|||
Parameter |
|||
MessageBinder |
|||
View |
|||
BindingScope |
|||
ExtensionMethods |
简单的方法扩展不细讲 |