我应该在Silverlight项目中使用Model-View-ViewModel(MVVM)模式吗?
Silverlight控件的一个挑战是,当属性绑定到代码时,它们在Blend中不再是真正可编辑的。 例如,如果您有一个从数据馈送填充的ListView,则在Blend中编辑控件时,没有可见的元素。
我听说WPF开发社区所发起的MVVM模式也可以帮助保持Silverlight控件“可混合”。 我还在围着它,但是这里有一些解释:
- http://www.nikhilk.net/Silverlight-ViewModel-Pattern.aspx
- http://mark-dot-net.blogspot.com/2008/11/model-view-view-model-mvvm-in.html
- http://www.ryankeeter.com/silverlight/silverlight-mvvm-pt-1-hello-world-style/
- http://jonas.follesoe.no/YouCardRevisitedImplementingTheViewModelPattern.aspx
一个潜在的缺点是,该模式需要额外的类,但不一定更多的代码(如上面的第二个链接所示)。 思考?
我绝对认为你应该为Silverlight应用程序使用MVVM模式 – 而模式的好处之一是,你可以通过一些简单的技术真正使你的应用程序真正的混合。 我经常将“可混合性”称为“可devise性devise” – 您使用某些技术来确保您的应用程序在Blend中看起来很棒。
像Torbjørn指出的技术之一就是使用dependency injection框架,并根据代码是在Blend还是在浏览器中执行,提供不同的外部服务实现。 所以我configuration我的容器在代码在Blend中执行时使用一个虚拟数据提供程序,这样你可以为你的列表框,数据网格等devise时间支持。
面临的挑战往往是如何声明性地设置DataContext – 所以我经常最终将服务定位器类作为“前端”使用到IoC容器中。 这样我可以将数据上下文绑定到服务定位器上的一个属性。
另一种技术是创build一些具有两个属性的ObjectDataSource控件(不可视):Design Time DataContext和RunTime Data Context。 该控件执行检测正在执行的位置,然后将Parent DataContext设置为正确的对象。
我不确定我是否可以回答你的问题,但我已经find了下面的文章非常有价值。 JonasFollesø在devise/混合模式下使用ninject来切换他的服务。 非常好!
http://jonas.follesoe.no/YouCardRevisitedImplementingDependencyInjectionInSilverlight.aspx
我也同意Jonas关于Silverlight的MVVM。 我相信MVP也是一个不错的select,但是最近我有时间尝试使用Silverlight的MVP和MVVM,并且我对MVVM的结果感到高兴。 (是的,我改变了我的意见越多,我用MVVM)。 虚拟机从MVVM中的View(显然)抽象模型的绑定,允许更多的绑定场景(至less比干净的方式来做)比MVP。 但这只是一个方面。
我将在我的网站上发布一些MVP和MVVM与Silverlight的例子。
我已经尝试了几个选项,我正在把MVVM作为我的最佳select。 可混合性是一个重要的点,我也发现VM方面直观的安装dynamic行为和程序效果和animation(如Nikhil的Silverlight.FX)。 有一次,我试图通过stream畅的界面来完全避免Blend,但是从长远来看,我发现UI和行为之间的耦合太痛苦了。 我想在Blend中devise我的UI,然后在代码中添加效果和其他行为,这被certificate是迄今为止最好的模式。
我想我们中的很多人都在等待开拓者前进,并使用Silverlight中的MVVM(和WPF)来创build非常好的示例应用程序。 有一些棘手的领域,比如在Silverlight中缺lessICommand ,或者仅仅使用数据绑定来开始和停止与animation交互的困难。
这绝对是一个值得关注未来的模式,值得一试的是,如果你不介意在你无法想象的地方偶尔作弊。
我喜欢ViewModel模式,并高度推荐它。 我的博客中有几个“ViewModel”types的post。
- ViewModel模式
- HelloWorld.ViewModel
- 绑定转换 – VisibilityConverter
- Silverlight航空公司与ViewModel
我同意乔纳斯 。 MVVM似乎是最适合我的模式(尽pipeJohn Papa认为MVP更有意义)。 我有一个MSDN文章在3月份出来,希望能回答这个呼吁一个很好的例子。
顺便说一下,我希望在MVVM框架部门看到一些凝聚力。 目前还没有一个好的解决scheme。 我喜欢乔纳斯(我认为乔纳斯是FX框架),但由于它不是WPF兼容,它可能不是一些正确的select。
我最近在一些不同的Silverlight项目中使用了MVVM,并且它工作的非常好,我一定会推荐它。 Jonas的post是一个很好的开始,最近我也在博客上讨论了我的MVVM经验,并创build了一个非常简单的解决scheme来演示主要的触点。
有一个很好的Techdays 2010videoMVVM模式的介绍,清楚地解释:
- TechDays 2010:了解Model-View-ViewModel模式
- 由Laurent播放的Hanselminutes播客
对于需要更高程度的自动化testing的更复杂的应用程序来说,它肯定是有意义的,从DependencyProperties到DataContext绑定的转移要比ASP.NET的要复杂得多。
我在Silverlight中遇到的最大挑战就是testing实际的UI(到目前为止,我认为有一个商业框架),以及在Silverlight中使用WCF服务(或WebClient)时遇到的大量事件调用。
我一直认为MVVM和PresntationModel http://martinfowler.com/eaaDev/PresentationModel.html基本上是一样的东西。; PresentationModel说起来容易多了。 我已经用java swing,windows窗体,WPF和silverlight成功地使用了它。 如果从分离关注的angular度来看,表示模型是非常有意义的。 你有一个课程,只关心提供一个演示友好的模型。用什么技术在屏幕上显示它并不重要。 这可能会改变一些实现的细节,但不pipe如何显示信息,拆分关注点都是一个好主意。 由于这种分离,无论视图技术如何,您都可以轻松地针对演示文稿模型编写testing。 所以这是一个加号。
随着P&P 2009年2月发布的Prism v2,现在可以更好地支持Silverlight和WPF的MVVM。 有关更多详细信息,请参阅microsoft.com/compositewpf 。
看看我的文章关于MVVM和Silverlight在现实生活中的项目,并为自己决定。
http://alexburtsev.wordpress.com/2011/03/05/mvvm-pattern-in-silverlight-and-wpf/