我应该在 Silverlight 项目中使用模型-视图-视图模型 (MVVM) 模式吗?
Posted
技术标签:
【中文标题】我应该在 Silverlight 项目中使用模型-视图-视图模型 (MVVM) 模式吗?【英文标题】:Should I use the Model-View-ViewModel (MVVM) pattern in Silverlight projects? 【发布时间】:2010-09-27 09:07:23 【问题描述】: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一个潜在的缺点是该模式需要额外的类,尽管不一定需要更多代码(如上面的第二个链接所示)。想法?
【问题讨论】:
我还建议你使用 IOC、Caliburn-Micro 和 Ninject 来做一个很棒的组合。 【参考方案1】:我不确定我是否能回答你的问题,但我发现下面的文章非常有价值。 Jonas Follesø 在设计/混合模式下使用 ninject 来切换他的服务。很不错!
http://jonas.follesoe.no/YouCardRevisitedImplementingDependencyInjectionInSilverlight.aspx
【讨论】:
【参考方案2】:我已经尝试了几个选项,我决定将 MVVM 作为我的最佳选择。可混合性是很重要的一点,我还发现 VM 方面对于装配动态行为、程序效果和动画(如 Nikhil 的 Silverlight.FX)很直观。有一次,我试图通过流畅的界面完全避免 Blend,但从长远来看,我发现 UI 和行为之间的耦合太痛苦了。我想在 Blend 中设计我的 UI,然后在代码中添加效果和其他行为,这被证明是迄今为止我遵循的最佳模式。
【讨论】:
【参考方案3】:我绝对认为您应该将 MVVM 模式用于 Silverlight 应用程序 - 该模式的好处之一是您实际上可以通过一些简单的技术使您的应用程序真正可混合。我经常将“可混合性”称为“可设计性设计”——您使用某些技术来确保您的应用程序在 Blend 中看起来很棒。
其中一种技术(如 Torbjørn 指出的)是使用依赖注入框架并根据代码是在 Blend 中还是在浏览器中执行来提供外部服务的不同实现。因此,当代码在 Blend 中执行时,我将容器配置为使用虚拟数据提供程序,这样您就可以获得对列表框、数据网格等的设计时支持。
挑战通常是如何以声明方式设置 DataContext - 所以我经常使用服务定位器类作为 IoC 容器的“前端”。这样我就可以将数据上下文绑定到服务定位器上的属性。
另一种技术是创建某种具有两个属性的 ObjectDataSource 控件(非可视):设计时数据上下文和运行时数据上下文。该控件负责检测正在执行的位置,然后将 Parent DataContext 设置为正确的对象。
【讨论】:
【参考方案4】:我最近在几个不同的 Silverlight 项目中使用了 MVVM,它运行得非常好,我肯定会推荐它。 Jonas's post 是一个很好的起点,我最近也在 blogged 上介绍了我的 MVVM 体验,并创建了一个非常简单的解决方案来演示主要接触点。
【讨论】:
【参考方案5】:我一直认为 MVVM 和 PresntationModel http://martinfowler.com/eaaDev/PresentationModel.html 本质上是一回事。 PresentationModel 说起来容易得多。 我已经在 java swing、windows forms、WPF 和 silverlight 中成功使用了它。如果您从关注点分离的角度考虑,则表示模型很有意义。你有一个类,它唯一关心的是提供一个演示友好的模型。使用什么技术在屏幕上显示它真的无关紧要。它可能会更改一些实现细节,但无论您如何显示信息,将关注点分开是一个好主意。 由于这种分离,无论视图技术如何,您都可以轻松地针对您的演示模型编写测试。所以这是一个加号。
【讨论】:
【参考方案6】:我认为我们中的许多人都在等待开拓者继续前进,并使用 Silverlight 中的 MVVM(以及就此而言的 WPF)创建非常好的示例应用程序。有许多棘手的领域,例如lack of ICommand in Silverlight,或者interacting with animations 仅使用数据绑定启动和停止的难度。
这绝对是一个值得关注的模式,如果你不介意偶尔在你无法弄清楚的地方“作弊”,那么值得一试。
【讨论】:
【参考方案7】:I agree with Jonas。 MVVM 似乎是最适合我的模型(尽管 John Papa 认为 MVP 更有意义)。我有一篇关于这方面的 MSDN 文章将于 3 月发布,希望能作为一个很好的例子来响应号召。
顺便说一句,我希望看到 MVVM 框架部门的一些凝聚力。目前还没有一个好的框架可以遵循的解决方案。我喜欢 Jonas(我认为 Jonas 是 FX 框架),但由于它不兼容 WPF,因此它可能不是某些人的正确选择。
【讨论】:
【参考方案8】:I also agree with Jonas 关于带有 Silverlight 的 MVVM。我确实相信 MVP 也是一个不错的选择,但最近我有时间尝试使用 Silverlight 的 MVP 和 MVVM,我对 MVVM 的结果更满意。 (是的,我使用 MVVM 越多,我就改变了主意)。 VM 从 MVVM 中的视图(显然)抽象了模型的绑定,这允许比 MVP 更多的绑定场景(至少更简洁的方式来完成它们)。不过,这只是一方面。
我将在我的网站上发布一些使用 Silverlight 的 MVP 和 MVVM 示例。
【讨论】:
【参考方案9】:我喜欢 ViewModel 模式并强烈推荐它。我的博客上有几篇“ViewModel 入门”类型的帖子。
ViewModel Pattern HelloWorld.ViewModel Binding Converts - VisibilityConverter Silverlight Airlines with a ViewModel【讨论】:
【参考方案10】:随着 2009 年 2 月 P&P 发布的 Prism v2,Silverlight 和 WPF 现在可以更好地支持 MVVM。详情请见microsoft.com/compositewpf。
【讨论】:
【参考方案11】:有一个非常好的 Techdays 2010 视频介绍 MVVM 模式,解释清楚:
TechDays 2010: Understanding the Model-View-ViewModel pattern Hanselminutes podcast by Laurent对于需要更高程度自动化测试的更复杂的应用程序,这绝对是有意义的,从 DependencyProperties 到 DataContext 绑定的转变比它的 ASP.NET 对应项要简洁得多。
我在 Silverlight 中发现的最大挑战是测试实际 UI(我认为目前只有一个商业框架),以及在使用 WCF 服务(或 WebClient 相关)时遇到的大量事件调用使用 Silverlight。
【讨论】:
【参考方案12】:看看我关于现实生活项目中的 MVVM 和 Silverlight 的文章,然后自己决定。
http://alexburtsev.wordpress.com/2011/03/05/mvvm-pattern-in-silverlight-and-wpf/
【讨论】:
以上是关于我应该在 Silverlight 项目中使用模型-视图-视图模型 (MVVM) 模式吗?的主要内容,如果未能解决你的问题,请参考以下文章
我应该始终在 Silverlight 游戏中使用游戏循环吗?
如何在 Silverlight 中使用 DataTemplate 显示单个项目?