题
我正在使用 MVVM 模型开发一个应用程序,但我已经到了需要选择使用哪个框架的地步。
可能的选项包括:
- MVVM工具包
- MVVM基金会
- WPF 应用程序框架 (WAF)
- 轻型MVVM
- 卡利本
- 肚带
- 棱镜
根据您的经验,哪个更好?
解决方案
这实际上取决于您想要实现的目标,以及您想要部署多少基础设施,以及您是否可以轻松找到可以帮助您的示例。我要在这里声明我的兴趣,因为我积极参与了至少一个 MVVM 框架,并且我通过 WPF Disciples 小组向其他框架提供了意见,所以我有点偏见。话虽如此,这里是:
微软 MVVM工具包 - 这仍然处于 alpha 阶段。当它最初发布时,由于它没有做的事情,它受到了门徒们的一些猛烈攻击。话虽如此,微软正在寻求加强这个框架,所以它值得关注——它只是还没有准备好。
MVVM基金会 - 啊乔什史密斯的框架版本。Josh 是 MVVM 之父之一,并且一直是该模式的大力倡导者和导师。因此,您在其他框架中发现的很多内容都带有 Josh 的痕迹。该框架旨在提供 MVVM 的基础知识,而不是解决一些更深奥的问题。最初,这仅适用于 WPF,但 Laurent Bugnion 和我自己等人添加了功能/项目,这意味着这也将是一个 Silverlight 兼容框架。
WAF - 没有经验,所以恐怕我无法对此发表评论。
MVVM 光 - Laurent Bugnion 的看法,刚刚更新到版本 2。这是一个非常好的框架,但同样它并不打算涵盖 MVVM 应用程序的每个方面。鉴于 Laurent 的背景,它具有非常强大的 Silverlight 和 Blendability 支持。
更新 Laurent 刚刚告诉我 .NET 3.5 和 .NET 4.0 版本功能兼容。瓦乌去劳伦特。
Cinch - Sacha Barber 的优秀 WPF MVVM 框架。这比我上面讨论的框架涵盖的内容更多。这是一个优秀的框架,并利用了 Bill Kempf 的优秀著作中涵盖的概念。 玛瑙 项目。Onyx 旨在补充 MVVM 框架,并添加人们通常很难在 MVVM/WPF 中实现的功能。再次强调,Onyx 最初只打算用于 WPF,但现在已经实现了 SL 兼容性——我对参与其中感到特别自豪。
棱镜 - 再说一遍,我从未使用过它,但我听说过很多关于它的好消息。
海洋 - Cider 团队的项目经理 Karl Shifflett 最近发布了功能齐全的 WPF MVVM 框架。再说一遍,这是一个优秀的框架,有很多值得推荐的地方。
最重要的是,下载不同的框架并查看它们,然后找出哪一个最直观地适合您的思维方式和需求。如果您认为您可能希望从相同的代码库支持 Silverlight,那么仅 WPF 框架应该打折扣。
其他提示
我发现这篇文章非常有用 http://www.japf.fr/2009/10/a-quick-tour-of-existing-mvvm-frameworks/ 这样我就把它带到这里供即将到来的用户使用
我更新了 Cinch 部分并为其功能添加了 silverlight 支持
我很抱歉这个故事很长
共同特征:
• ViewModelBase 类(用于实现 INotifyPropertyChanged 接口)
• RelayCommand 类,用于将 UI 命令链接到 ViewModel 的处理程序
• 框架附带单元测试
肚带
• 作者:萨莎·巴伯
• Silverlight 支持:否(Cinch 版本 2 支持 Silverlight)
• 文档:优秀,在 CodeProject 上发表了 6 篇文章
• 托管:代码库
• 执照:代码项目开放许可证
• 特征:
依附行为
使用 IDataErrorInfo 进行验证
支持 IEditableObject
弱事件创建和订阅
使用弱事件的中介消息传递
IOC/DI 支持(使用 Unity)
服务:事件记录器、消息框、打开保存对话框、弹出窗口
线程助手
支持菜单项
可关闭的视图模型
MVVM 代码生成器
MVVM 轻型工具包
• 作者:洛朗·巴尼翁
• Silverlight 支持:是的
• 文档:Laurent 的博客以及其他开发人员上提供了许多文章
• 托管:代码库
• 执照:麻省理工学院许可证
• 特征:
MSI 安装程序
VS 项目和项目模板
VS代码片段
用于视图模型间通信的信使系统
将事件作为命令处理
MVVM 助手
• 作者:马克·史密斯
• Silverlight 支持:不
• 文档:马克博客上的一些文章
• 托管:个人网站
• 执照:没有定义的
• 特征:
依附行为
使用标记扩展创建视图模型
基于属性的验证
使用 ServiceProvider 方法的 IOC/DI
可关闭视图模型
等待光标(使用 new WaitCursor() { // 这里是您的代码 })
MVVM基金会
• 作者:乔什·史密斯
• Silverlight 支持:不
• 文档:Josh 或 Marlon Grech 的博客上有关 Messenger 实施的文章
• 托管:代码库
• 执照:MS-PL
• 特征:
用于视图模型间通信的信使系统
PropertyChanged 事件监视器
卡利本
• 作者:罗布·艾森伯格
• Silverlight 支持:是的
• 文档:提供完整的在线文档
• 托管:代码库 http://www.codeplex.com/caliburn
• 执照:麻省理工学院许可证
• 特征:
命令构建在 Action 之上,因此共享许多相同的功能,包括多个输入参数、过滤器和自动异步执行
处理 UI 生命周期问题的演示者,例如处理各种 UI 组件的激活、停用和关闭语义
Caliburn 应用程序是完全可测试的
各种实用程序,例如后台任务管理器
支持各种UI模式(不仅仅是MVVM)
依赖注入容器
玛瑙
• 作者:威廉·肯普夫
• Silverlight 支持:不
• 文档:CodePlex 上提供了基本介绍
• 托管:代码库
• 执照:未指定
• 特征:
服务定位器模式
使用自定义标记扩展创建 ViewModel
UI 相关服务,例如 IDisplayMessage
钙
• 作者:丹尼尔·沃恩
• Silverlight 支持:不
• 文档:关于 CodeProject 的 2 篇非常详细的文章(第 1 部分和第 2 部分)
• 托管:代码库
• 执照:使用、复制、修改和/或分发并保留版权!
• 特征:
用于在运行时启用或禁用模块的模块管理器
消息传递服务,用于使用相同的 API 从客户端或服务器与用户进行交互
用于将 WPF ICommand 与仅在活动视图或视图模型实现该接口时才变为活动的内容接口关联的命令服务
工具栏和菜单的区域适配器
客户端-服务器日志记录开箱即用
包括 Web 浏览器、文本编辑器、输出窗口等模块
带有脏文件指示的选项卡式界面(可跨模块重用)
路由
• 作者:仙人
• Silverlight 支持:是的
• 文档:作者博客上有许多文章(请参阅 CodePlex 项目主页的链接)
• 托管:代码库
• 执照:MS-PL
• 特征:
支持 Blend3 行为和触发器模型
资源定位器框架
查看服务:打开文件对话框、显示消息...
使用属性将 View 和 ViewModel 映射在一起
尼托MVVM
• 作者:沙玛
• Silverlight 支持:不
• 文档:不
• 托管:代码库
• 执照:未指定
• 特征:
- ICommand 接口的各种 MVVM 友好实现
海洋
• 作者:卡尔·希夫莱特
• Silverlight 支持:不
• 文档:Karl 博客上提供的文章
• 托管:个人网站
• 执照:未指定
• 特征:
用 VB.Net 编写
基于属性的验证
视图模型基类:中继命令、closeableviewmodel...
SQL Server 数据访问层
基本的MVVM框架
• 作者:莱斯特·洛博
• Silverlight 支持:不
• 文档:库中提供的示例应用程序
• 托管:代码库
• 执照:MS-PL
• 特征:
委派命令\按键绑定
VM 之间的消息传递
将事件作为带有附加行为的命令来处理
将对话框(以及更多)作为服务处理
VS代码片段
好莱特
• 作者:Peter O’Hanlon •Silverlight 支持:是的
• 文档:库中提供的示例应用程序
• 托管:代码库
• 执照:MS-PL
• 特征:
“工作区”管理(可关闭的文档集)
皮肤支撑
VM 之间的消息传递
我尝试描述皮特的精彩答案中缺少的框架:
MVVM 工具包(微软) 是一个非常轻量级的库,带有 Visual Studio 项目模板,应该支持初学者使用此模式。如果 Microsoft 对其 Toolkit 获得良好的反馈,那么他们可能会将其实现为新的 Visual Studio(可能是 2010)项目模板。
Prism(微软 p&p) 是一个不仅仅提供对 MVVM 模式的支持的框架。该项目的主要目标是帮助您构建 模块化的 WPF 和/或 Silverlight 应用程序。当你只需要实现 MVVM 模式或者你是 .NET/WPF 的初学者时,我不会推荐这个项目。也可以看看: 关联.
WPF 应用程序框架 (WAF) 是一个轻量级框架,可帮助您使用 MVVM 创建 WPF 应用程序。它仅适用于 WPF,因此不支持 Silverlight。与大多数其他 MVVM 框架相比,它采用了另一种方式,引入了 控制器. 。它们负责应用程序工作流程并在各种 ViewModel 之间进行协调。
嗯。Mvvm 实际上并不需要整个框架来支持 IMO。如果您理解这个概念,那么从实现 INotify 的干净 VM 基类开始,然后从那里开始就非常简单了。
混合你自己的!
我使用了 PRISM 的 EventAggregator、MVVM 基金会的 ViewModelBase 等等。我还调整了 RelayCommand(在某些地方称为 DelegateCommand)以接受其他数据,等等。
我不会只推荐一种框架本身。
我的赌注是 Caliburn 和 MVVMlight,似乎这些 mvvm 框架支持 silverlight 的不多。我可以预见,将会有比 IoC 框架更多的 MVVM 框架可供选择,因为为 mvvm 框架设置功能边界更困难。我想找出哪一个更适合您的项目的最佳方法是列出/比较它们的功能。
另请查看 Mix10。我从谈话中学到了很多东西:构建你的 mvvm 框架。
还有 Cocktail 和 DevForce 框架 理念之刃
我正在使用 Prism 并且喜欢它。对我来说最重要的事情之一是,如果需要的话,会有其他人可以帮助我,并且有好的例子。一旦您运行了基础知识,您的应用程序就需要一大堆扩展,并且当您使用与其他人相同的框架时,它会变得更加容易。
总而言之,我的应用程序完成了 90%,我所使用的 MVVM Toolkit 就是工厂函数,它为我构建一个命令,给定一个在 Execute 中启动的委托函数。我想我可以在几个小时内切换到任何其他框架或不使用框架。
另一种需要考虑的是 MEFedMVVM. 。我已经在几个项目中使用过它,它是轻量级的、非侵入性的并且支持 Silverlight 和 WPF。对于那些使用该产品的人来说,它还能够支持 Blend 中的设计时数据。
如果您正在寻找 WPF/MVVM 应用程序框架之上的可扩展性(编写插件的能力),那么您可能会对 肥皂盒芯 免责声明:我写的. 。它是开源的,所以即使您不使用它,也可能有一些好主意适合您。它使用 MEF 来实现可扩展性和 IoC。
还有 路由
一个非常好的 WPF/Silverlight 应用程序框架,支持 MVVM