最近写了一些 MVVM 框架的文章,翻了一些 Microsoft Docs 的文档,顺便就对 MVVM 本身来了兴致,想看看更多当年相关的文档。在 MVVM 出现后十多年,我在不同的场合见到过多种 MVVM 的实现方式,也看到过各种 MVVM 框架的多次改进(这些框架通常包含多个用于实现解耦体系结构的服务,在一定程度上使 MVVM 的确切定义变得模糊),这些都让我对 MVVM 的理解变得多样化。这种情况下重温一下 MVVM 的文档也并不是毫无意义。
在 Microsoft Docs 网站上搜 “MVVM” 关键字有 200 多个结果,搜 ViewModel 关键字有 1400 多个结果,要全部看完显然太多。我一边回顾/重温,一边整理了一些有趣的文档以供参考。
1. MSDN 杂志
首先是 MSDN 杂志。在发行 30 多年后,MSDN 杂志完成了它的使命。今天我们仍可以在 Microsoft Docs 上找到当年的 MSDN 杂志的存档,其中关于 MVVM 的内容也有不少。虽然也有介绍如何使用 MVVM 框架的文章,但难道使用 MVVM 就一定要用框架吗,MVVM 岂是如此不便之物。下面我只列出了 MSDN 杂志中关于 MVVM 本身的内容。部分中文翻译的文章我直接给出中文地址,其它则是英文原文。
Patterns - WPF Apps With The Model-View-ViewModel Design Pattern
使用 Model-View-ViewModel 的问题和解决方案
用于 WPF 的 Model-View-Presenter-ViewModel 设计模式
在 Windows 8 中使用 MVVM 模式
Maximizing the Visual Designer’s Usage with Design-Time Data
Leveraging Windows 8 Features with MVVM
使用 MVVM 编写跨平台表示层
使用 MVVM 编写可测试的表示层
针对异步 MVVM 应用程序的模式:数据绑定
针对异步 MVVM 应用程序的模式:命令
针对异步 MVVM 应用程序的模式:服务
MVVM 应用程序中的多线程与调度
最大限度地利用Roslyn体验MVVM
2. Prism
接下来看看 Prism。Prism 本来由微软 patterns & practices 团队领导,后来 离家出走,现在的新家在 Github,也有了独立的 官方文档。虽然分开了,可是微软倒是挺念旧,搬了新家也带着 Prism 的旧文档。可别以为这份 2014 年的旧文档年纪大了就没用了,先来看看这个 6 岁的老同志的介绍:
Prism以示例和文档的形式提供指导,帮助您轻松设计和构建丰富、灵活、易于维护的 Windows Presentation Foundation(WPF)桌面应用程序。使用包含重要架构设计原则(如关注点分离和松耦合)的设计模式,Prism可以帮助您使用松散耦合组件设计和构建应用程序,这些组件可以独立演化,但可以轻松无缝地集成到整个应用程序中。简而言之,这些应用程序是“为持久而构建”和“为改变而构建的”。这些类型的应用程序被称为复合应用程序。
Prism 并不仅仅是一个 MVVM 框架,它还是微软曾经给出的最好的 Wpf 实践指导。这份总建议阅读时间超过 7 小时的文档是微软 patterns & practices 团队交给 Wpf 开发者的最后的波纹。它解释了 Wpf 不同于 WinForms 的 UI交互,并介绍了架构设计原则、包含 MVVM、依赖注入在内的多种设计模式以及 Prism 的使用和实现原理,还有各种模式的代码示例,通过阅读这些文档,我敢保证,你的英语会变好一些。
Developer's Guide to Microsoft Prism Library 5.0 for WPF
1: Introduction to the Prism Library 5.0 for WPF
2: Initializing Applications Using the Prism Library 5.0 for WPF
3: Managing Dependencies Between Components Using the Prism Library 5.0 for WPF
4: Modular Application Development Using Prism Library 5.0 for WPF
5: Implementing the MVVM Pattern Using the Prism Library 5.0 for WPF
6: Advanced MVVM Scenarios Using the Prism Library 5.0 for WPF
7: Composing the User Interface Using the Prism Library 5.0 for WPF
8: Navigation Using the Prism Library 5.0 for WPF
9: Communicating Between Loosely Coupled Components Using the Prism Library 5.0 for WPF
10: Deploying Applications Using the Prism Library 5.0 for WPF
11: Glossary for the Prism Library 5.0 for WPF
12: Patterns in the Prism Library 5.0 for WPF
13: Prism Library 5.0 for WPF
14: Upgrading from Prism Library 4.1
15: Extending the Prism Library 5.0 for WPF
16: Code Samples Using the Prism Library 5.0 for WPF
17: Getting Started Using the Prism Library 5.0 for WPF Hands-on Lab
18: Publishing and Updating Applications Using the Prism Library 5.0 for WPF Hands-on Lab
上面的是 Prism 5 的文档, 其实 Prism 4 的文档也差不多,我在博客园上找到一份 Prism 4 的文档翻译:
Prism - 随笔分类 - 西夏 - 博客园
还有这份08年的文档,介绍了 Prism 最初的概念:
Prism (Composite Application Guidance for WPF)
3. Xamarin 中的 MVVM
近几年 Xamarin 的文档颇有活力,其中关于也有几篇关于 MVVM 的内容:
The Model-View-ViewModel Pattern
Using the Model-View-ViewModel (MVVM) pattern in a Windows Store business app using C#, XAML, and Prism
第 18 章:MVVM
从数据绑定到 MVVM
4. 数据绑定
大致上关于 MVVM 的文档就是上面这些了。另外还需要确保数据绑定和命令的知识,它们是 MVVM 最基础的概念,所以这方面的文档也可以看一看。
关于数据绑定,由于是 XAML 平台的基础,各个平台的文档都写得很详细。Wpf 的数据绑定文章写在一篇里,预计阅读时间长达38分钟:
Data binding overview in WPF
Xamarin 的数据绑定文档相对友好,分成多篇文章:
Xamarin.Forms 数据绑定
比起 Wpf 和 Xamarin,我觉得 Uwp 的文档更有趣些,虽然 Uwp 的数据绑定和 Wpf 的有很多不同,但也很值得参考:
数据绑定概述
深入了解数据绑定
x:Bind 中的函数
教程:创建数据绑定
设计面图上以及用于原型制作的示例数据
绑定分层数据和创建大纲/细节视图
数据绑定和 MVVM
5. 其它
在稍微复杂一些的 XAML 中一个元素可能很难搞清楚自己的 DataContext,因为这涉及它的逻辑树、Parent 的DataContext、DataTemplete 等。总之,使用 Binding 的元素需要搞清楚自己的定位。所以了解一下 Data Templating 和 Trees in WPF 对做好 DataBinding 也会有帮助。
另外,只有少量的控件有对 ICommand 的处理,所以通过 使用行为 将数据和事件转换为 Command 的调用是实现 MVVM 必不可少的技能。
6. 最后
写这篇文章的过程简直成了大型考古,很开心有机会重温这些当年帮了我很多的文档。可喜的是十年前的文章对 XAML 开发居然还有用,可悲的是十年前的文章对 XAML 开发居然还有用。
Microsoft Docs 保存了多年来微软各种技术文档的存档,有兴趣的话你也可以在这里寻找到当年的回忆。