我应该在Silverlight项目中使用Model-View-ViewModel(MVVM)模式吗?

时间:2008-12-17 17:17:30

标签: silverlight design-patterns mvvm

Silverlight控件的一个挑战是,当属性绑定到代码时,它们在Blend中不再可编辑。例如,如果您有一个从数据源填充的ListView,则在Blend中编辑控件时没有可见的元素。

我听说由WPF开发社区发起的MVVM模式也可以帮助保持Silverlight控件“可混合”。我仍然围绕着它,但这里有一些解释:

一个潜在的缺点是该模式需要额外的类,但不一定是更多的代码(如上面的第二个链接所示)。想法?

12 个答案:

答案 0 :(得分:32)

我绝对认为您应该将MVVM模式用于Silverlight应用程序 - 该模式的一个好处是,您可以通过一些简单的技术实际上使您的应用程序真正可混合。我经常将“可混合性”称为“可设计性设计” - 您使用某些技术来确保您的应用程序在Blend中看起来很棒。

其中一项技术 - 如Torbjørn所指出的 - 是使用依赖注入框架并提供外部服务的不同实现,具体取决于在Blend或浏览器中执行代码的程度。因此,当代码在Blend中执行时,我将容器配置为使用虚拟数据提供程序,这样您就可以获得列表框,数据网格等的设计时支持。

挑战通常是如何以声明方式设置DataContext - 因此我经常最终使用服务定位器类作为IoC容器的“前端”。这样我就可以将数据上下文绑定到服务定位器上的属性。

另一种技术是创建某种ObjectDataSource控件(非可视),它具有两个属性:Design Time DataContext和RunTime Data Context。控件执行检测正在执行的位置的工作,然后将Parent DataContext设置为正确的对象。

答案 1 :(得分:4)

我不确定我是否可以回答你的问题,但我对下面的文章非常有价值。在设计/混合模式下,Jonas Follesø正在使用ninject来切换他的服务。非常好!

http://jonas.follesoe.no/YouCardRevisitedImplementingDependencyInjectionInSilverlight.aspx

答案 2 :(得分:3)

I also agree with Jonas关于使用Silverlight的MVVM。我相信MVP也是一个不错的选择,但最近我有时间用Silverlight尝试MVP和MVVM,我对MVVM的结果感到非常高兴。 (是的,我改变了主意,因为我使用的MVVM越多)。 VM从MVVM(显然)中抽象出模型的绑定,这允许比MVP更多的绑定场景(至少更简洁的方式)。但这只是一个方面。

我将在我的网站上发布一些使用Silverlight的MVP和MVVM示例。

答案 3 :(得分:2)

我已经尝试了一些选项,我将MVVM作为我的最佳选择。可混合性是一个重点,我也发现VM方面直观,可以用来绑定动态行为和程序效果和动画(比如Nikhil的Silverlight.FX)。有一次,我试图通过流畅的界面完全避免Blend,但我发现从长远来看,UI和行为之间的耦合太痛苦了。我想在Blend中设计我的UI,然后在代码中添加效果和其他行为,这被证明是迄今为止我遵循的最佳模式。

答案 4 :(得分:2)

我认为我们中的许多人都在等待开拓者继续使用Silverlight中的MVVM(以及WPF)来创建非常好的示例应用程序。有许多棘手的方面,例如lack of ICommand in Silverlight,或interacting with animations仅使用数据绑定启动和停止的难度。

它绝对是一种值得关注的未来模式,如果你不介意在你无法理解的地方偶尔“作弊”,那么值得一试。

答案 5 :(得分:2)

I agree with Jonas。 MVVM似乎是最适合我的模型(尽管John Papa认为MVP更有意义)。我在3月份发布了一篇关于这个问题的MSDN文章,希望能够回应一个好的例子。

顺便说一下,我想在MVVM框架部门看到一些凝聚力。对于框架来说,还没有一个好的解决方案。我喜欢Jonas'(我认为Jonas'是FX框架),但由于它不兼容WPF,它可能不适合某些人。

答案 6 :(得分:2)

我喜欢ViewModel模式并强烈推荐它。我的博客上有一些“ViewModel入门”类型的帖子。

答案 7 :(得分:1)

我最近在一些不同的Silverlight项目中使用过MVVM,它一直运行得很好,我肯定会推荐它。 Jonas's post是一个很好的起点,我最近blogged也参与了我的MVVM体验,并创建了一个非常简单的解决方案来演示主要的接触点。

答案 8 :(得分:1)

有一个非常好的Techdays 2010视频介绍MVVM模式,清楚地解释:

对于需要更高程度自动化测试的更复杂的应用程序,它绝对有意义,而且从DependencyProperties到DataContext绑定的转移比它的ASP.NET对应物要简洁得多。

我在Silverlight中发现的最大挑战是测试实际的UI(我认为到目前为止还有一个商业框架),以及使用WCF服务时遇到的大量事件调用(或WebClient)使用Silverlight。

答案 9 :(得分:0)

我一直认为MVVM和PresntationModel http://martinfowler.com/eaaDev/PresentationModel.html本质上是一回事。 PresentationModel更容易说。 我在java swing,windows forms,WPF和silverlight中成功使用了它。如果你从关注点分离的角度思考一个表达模型很有意义。你有一个课程,唯一关心的是提供一个简单的演示模型。用什么技术在屏幕上显示它并不重要。它可能会改变一些实现细节,但无论您如何显示信息,将问题分开都是一个好主意。 由于这种分离,无论视图技术如何,您都可以轻松地针对您的演示模型编写测试。这是一个加号。

答案 10 :(得分:0)

随着P& P 2009年2月发布的Prism v2,现在可以更好地支持Silverlight和WPF的MVVM。有关详细信息,请参阅microsoft.com/compositewpf

答案 11 :(得分:0)

看看我在实际项目中关于MVVM和Silverlight的文章,并自己决定。

http://alexburtsev.wordpress.com/2011/03/05/mvvm-pattern-in-silverlight-and-wpf/