摘要:
ViewRouter和ViewModelRouter可以说是Jounce里的核心之一,特别是在MVVM的应用上。-ViewRouter实现了3个接口,分别是IFluentViewXapRouter, IPartImportsSatisfiedNotification和IEventSink<ViewNavigationArgs>。IFluentViewXapRouter主要是涉及到模块化管理,下次再说。根据上次事件通信里所讲的,通过IEventSink<ViewNavigationArgs>和IPartImportsSatisfiedNotification的合作,Vie 阅读全文
摘要:
MVVM支持可以说是每个框架的标配了。Jounce的这个部分也是参考了其他的几个框架,这里面东西比较多:ActionCommand基本上就是Prism里的DelegateCommand,不过只有个泛型的版本。BaseNotify则类似Prism里的NotificationObject,里面多了个方法,比较新奇:RaisePropertyChanged 1 /// <summary> 2 /// Raise a property change and infer the frame from the stack 3 /// </summary> 4 /// <rem 阅读全文
摘要:
按照作者说的,Jounce里的工作流也受到Caliburn的很大启发(Prism里没有类似概念)。因为还没仔细研究过Caliburn,不知道Caliburn和CM的区别有多大。CM里面的工作流叫做Coroutine,整体使用和里面的Action息息相关。相对来说来Jounce里工作流的定义和使用就比较简单。此处涉及的类和接口有:工作项的接口IWorkflow,定义了执行工作的方法Invoke和工作完成后的回调Invoked。工作流控制台WorkflowController,定义了2个静态重载方法Begin用于启动工作流,可以传入的参数是IEnumerable<IWorkflow>或 阅读全文
摘要:
Prism、CM和Jounce里都有各自的事件通信机制,也都叫EventAggregator。相比于Prism,Jounce里的EventAggregator的风格更接近CM。当然作者也是这么说的:The pattern here is based on the lightweight version Rob Eisenburg introduced with Caliburn Micro。这里涉及的类主要有三个:两个接口类IEventAggregator和IEventSink<in T>,还有实现IEventAggregator的EventAggregatorService。IE 阅读全文
摘要:
日志记录在各个框架里都是差不多的。Jounce里的这个部分也比较简单。涉及的类有三个:接口ILogger、基础实现DefaultLogger和消息等级枚举LogSeverity。ILogger中定义了4个方法,3个是用来记录日志的,还有1个是SetSeverity(LogSeverity minimumLevel)。根据DefaultLogger中的实现来看,在其内部维护了一个消息等级的变量“_severityLevel”,可以通过SetSeverity方法来进行设置,其相当于一个阈值,控制当前的日志信息要不要输出(作者本意应该是如此吧,实际应用中可以更灵活的变通)。DefaultLogger 阅读全文
摘要:
Jounce框架的启动风格相比Prism和CM有点不太一样。Jounce的启动类叫做ApplicationService,实现了接口IApplicationService, IApplicationLifetimeAware, IDisposable。在IApplicationService.StartService(ApplicationServiceContext context)方法中,Jounce会初始化MEF容器和几个Jounce部件(日志部件ILogger,Xap包加载服务IDeploymentService,视图路由器ViewRouter,事件聚合器IEventAggregato 阅读全文
摘要:
能用在SL上的框架现在比较多了,挺出名的有Prism,Caliburn Micro(Caliburn),Mvvm Light,每个框架都有各自的专长,而且也都提供了对WPF和WP7的支持,有时间也写一下每个框架的学习笔记以提高印象。最近在看Jounce,感觉还不错,不过还没在实际项目中用过,所以记下笔记就更重要了。相比楼上的几个框架,Jounce就显得比较专一了,只是利用MEF提供了对Silverlight的支持。按照作者jeremylikness的话说就是受到了Prism和CM的启发(我也看到了一些Mvvm Light的影子,不知道是哪个参考的哪个或者是趋同进化),然后基于企业应用上实际的工 阅读全文
摘要:
在WPF和SL5中都有RelativeSource是FindAncestor绑定,这是个很实用的绑定功能,特别是在配置模板的时候。可惜SL4里还没有,让我们来通过几个辅助类简单的实现一下。主要思路还是通过VisualTreeHelper获取Parent来实现绑定。新建解决方案,添加个类叫做AncestorBinding提供一下绑定需要的基本属性,如下:View Code public class AncestorBinding { public string AncestorPath { get; set; } public string AncestorTypeName { get; set 阅读全文
摘要:
在前一篇文章Silverlight-TabControl扩展(2)中有定义一个string类型的附加属性DataTypeName,其实一开始是用Type类型的,但是在编译的时候报了个错误:未能从文本“***”创建“System.Type”。当时以为这个附加属性有点特殊(在Resources里附加给DataTemplate),所以编译器的支持可能不是太好。直到另一个有个自定义的很普通的Type类型的附加属性的解决方案,在我工作的电脑上可以顺利编译,但是拿到我的笔记本上编译就通不过了,也是报相同的错误。那么这个就不是特殊不特殊的问题了。Google这个错误,资料不多。Google英文“Failed 阅读全文
摘要:
上一篇简单扩展了TabControl的ItemsSource属性。只是只能应用一个统一的模板展示数据,但是毕竟ItemsSource是IEnumerable类型的,这就意味着里面的每个Item都可以有自己不同的Type,而相同的DataTemolate可能并不适用。在WPF和SL5中可以给DataTemplate标记DataType,这样ItemsControl会去自己识别相应的类型所需的模板。在SL4中也让我们来简单实践下。在TabControlExtensions类里增加一个DataTemplate的附加属性,实验证明Type类型并不能很好的被编译器识别,还是用string了。View C 阅读全文