[Windows] 在 Microsoft Docs 網站中挖掘 MVVM 的各種學習資源
阿新 • • 發佈:2020-12-09
![](https://img2020.cnblogs.com/blog/38937/202011/38937-20201127151036597-1223237602.png)
最近寫了一些 MVVM 框架的文章,翻了一些 [Microsoft Docs](https://docs.microsoft.com/zh-cn/?WT.mc_id=DX-MVP-5003606) 的文件,順便就對 MVVM 本身來了興致,想看看更多當年相關的文件。在 MVVM 出現後十多年,我在不同的場合見到過多種 MVVM 的實現方式,也看到過各種 MVVM 框架的多次改進(這些框架通常包含多個用於實現解耦體系結構的服務,在一定程度上使 MVVM 的確切定義變得模糊),這些都讓我對 MVVM 的理解變得多樣化。這種情況下重溫一下 MVVM 的文件也並不是毫無意義。
在 Microsoft Docs 網站上搜 “MVVM” 關鍵字有 200 多個結果,搜 ViewModel 關鍵字有 1400 多個結果,要全部看完顯然太多。我一邊回顧/重溫,一邊整理了一些有趣的文件以供參考。
## 1. MSDN 雜誌
![](https://img2020.cnblogs.com/blog/38937/202011/38937-20201127151059733-922267026.gif)
首先是 MSDN 雜誌。在發行 30 多年後,[MSDN 雜誌完成了它的使命](https://docs.microsoft.com/en-us/archive/msdn-magazine/2019/november/editor-s-note-hail-and-farewell)。今天我們仍可以在 Microsoft Docs 上找到當年的 MSDN 雜誌的[存檔](https://docs.microsoft.com/en-us/archive/msdn-magazine/msdn-magazine-issues),其中關於 MVVM 的內容也有不少。雖然也有介紹如何使用 MVVM 框架的文章,但難道使用 MVVM 就一定要用框架嗎,MVVM 豈是如此不便之物。下面我只列出了 MSDN 雜誌中關於 MVVM 本身的內容。部分中文翻譯的文章我直接給出中文地址,其它則是英文原文。
* [Patterns - WPF Apps With The Model-View-ViewModel Design Pattern](https://docs.microsoft.com/en-us/archive/msdn-magazine/2009/february/patterns-wpf-apps-with-the-model-view-viewmodel-design-pattern/?WT.mc_id=WD-MVP-5003763)
* [使用 Model-View-ViewModel 的問題和解決方案](https://docs.microsoft.com/ZH-CN/archive/msdn-magazine/2010/july/design-patterns-problems-and-solutions-with-model-view-viewmodel/?WT.mc_id=WD-MVP-5003763)
* [用於 WPF 的 Model-View-Presenter-ViewModel 設計模式](https://docs.microsoft.com/zh-cn/archive/msdn-magazine/2011/december/mvpvm-design-pattern-the-model-view-presenter-viewmodel-design-pattern-for-wpf/?WT.mc_id=WD-MVP-5003763)
* [在 Windows 8 中使用 MVVM 模式](https://docs.microsoft.com/zh-cn/archive/msdn-magazine/2012/windows-8-special-issue/mvvm-using-the-mvvm-pattern-in-windows-8/?WT.mc_id=WD-MVP-5003763)
* [Maximizing the Visual Designer’s Usage with Design-Time Data](https://docs.microsoft.com/en-us/archive/msdn-magazine/2013/april/mvvm-maximizing-the-visual-designer%E2%80%99s-usage-with-design-time-data/?WT.mc_id=WD-MVP-5003763)
* [Leveraging Windows 8 Features with MVVM](https://docs.microsoft.com/en-us/archive/msdn-magazine/2013/july/mvvm-leveraging-windows-8-features-with-mvvm/?WT.mc_id=WD-MVP-5003763)
* [使用 MVVM 編寫跨平臺表示層](https://docs.microsoft.com/zh-cn/archive/msdn-magazine/2013/september/mvvm-writing-a-cross-platform-presentation-layer-with-mvvm/?WT.mc_id=WD-MVP-5003763)
* [使用 MVVM 編寫可測試的表示層](https://docs.microsoft.com/zh-cn/archive/msdn-magazine/2013/november/mvvm-writing-a-testable-presentation-layer-with-mvvm/?WT.mc_id=WD-MVP-5003763)
* [針對非同步 MVVM 應用程式的模式:資料繫結](https://docs.microsoft.com/zh-cn/archive/msdn-magazine/2014/march/async-programming-patterns-for-asynchronous-mvvm-applications-data-binding/?WT.mc_id=WD-MVP-5003763)
* [針對非同步 MVVM 應用程式的模式:命令](https://docs.microsoft.com/zh-cn/archive/msdn-magazine/2014/april/async-programming-patterns-for-asynchronous-mvvm-applications-commands/?WT.mc_id=WD-MVP-5003763)
* [針對非同步 MVVM 應用程式的模式:服務](https://docs.microsoft.com/zh-cn/archive/msdn-magazine/2014/may/async-programming-patterns-for-asynchronous-mvvm-applications-services/?WT.mc_id=WD-MVP-5003763)
* [MVVM 應用程式中的多執行緒與排程](https://docs.microsoft.com/zh-cn/archive/msdn-magazine/2014/april/mvvm-multithreading-and-dispatching-in-mvvm-applications/?WT.mc_id=WD-MVP-5003763)
* [最大限度地利用Roslyn體驗MVVM](https://docs.microsoft.com/zh-cn/archive/msdn-magazine/2016/may/net-compiler-platform-maximize-your-model-view-viewmodel-experience-with-roslyn/?WT.mc_id=WD-MVP-5003763)
## 2. Prism
![](https://img2020.cnblogs.com/blog/38937/202012/38937-20201208112635102-1684971459.png)
接下來看看 [Prism](https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff921343(v=pandp.10)/?WT.mc_id=DX-MVP-5003606)。Prism 本來由微軟 patterns & practices 團隊領導,後來 [離家出走](https://devblogs.microsoft.com/dotnet/prism-grows-up/),現在的新家在 [Github](https://github.com/PrismLibrary/Prism),也有了獨立的 [官方文件](https://prismlibrary.com/docs/index.html)。雖然分開了,可是微軟倒是挺念舊,搬了新家也帶著 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](https://docs.microsoft.com/en-us/previous-versions/msp-n-p/gg406140(v=pandp.10)/?WT.mc_id=DX-MVP-5003606)
* [1: Introduction to the Prism Library 5.0 for WPF](https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff921153(v=pandp.40)/?WT.mc_id=DX-MVP-5003606)
* [2: Initializing Applications Using the Prism Library 5.0 for WPF](https://docs.microsoft.com/en-us/previous-versions/msp-n-p/gg430868(v=pandp.40)/?WT.mc_id=DX-MVP-5003606)
* [3: Managing Dependencies Between Components Using the Prism Library 5.0 for WPF](https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff921140(v=pandp.40)/?WT.mc_id=DX-MVP-5003606)
* [4: Modular Application Development Using Prism Library 5.0 for WPF](https://docs.microsoft.com/en-us/previous-versions/msp-n-p/gg405479(v=pandp.40)/?WT.mc_id=DX-MVP-5003606)
* [5: Implementing the MVVM Pattern Using the Prism Library 5.0 for WPF](https://docs.microsoft.com/en-us/previous-versions/msp-n-p/gg405484(v=pandp.40)/?WT.mc_id=DX-MVP-5003606)
* [6: Advanced MVVM Scenarios Using the Prism Library 5.0 for WPF](https://docs.microsoft.com/en-us/previous-versions/msp-n-p/gg405494(v=pandp.40)/?WT.mc_id=DX-MVP-5003606)
* [7: Composing the User Interface Using the Prism Library 5.0 for WPF](https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff921098(v=pandp.40)/?WT.mc_id=DX-MVP-5003606)
* [8: Navigation Using the Prism Library 5.0 for WPF](https://docs.microsoft.com/en-us/previous-versions/msp-n-p/gg430861(v=pandp.40)/?WT.mc_id=DX-MVP-5003606)
* [9: Communicating Between Loosely Coupled Components Using the Prism Library 5.0 for WPF](https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff921122(v=pandp.40)/?WT.mc_id=DX-MVP-5003606)
* [10: Deploying Applications Using the Prism Library 5.0 for WPF](https://docs.microsoft.com/en-us/previous-versions/msp-n-p/gg430856(v=pandp.40)/?WT.mc_id=DX-MVP-5003606)
* [11: Glossary for the Prism Library 5.0 for WPF](https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff921135(v=pandp.40)/?WT.mc_id=DX-MVP-5003606)
* [12: Patterns in the Prism Library 5.0 for WPF](https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff921146(v=pandp.40)/?WT.mc_id=DX-MVP-5003606)
* [13: Prism Library 5.0 for WPF](https://docs.microsoft.com/en-us/previous-versions/msp-n-p/gg405476(v=pandp.40)/?WT.mc_id=DX-MVP-5003606)
* [14: Upgrading from Prism Library 4.1](https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff921144(v=pandp.40)/?WT.mc_id=DX-MVP-5003606)
* [15: Extending the Prism Library 5.0 for WPF](https://docs.microsoft.com/en-us/previous-versions/msp-n-p/gg430866(v=pandp.40)/?WT.mc_id=DX-MVP-5003606)
* [16: Code Samples Using the Prism Library 5.0 for WPF](https://docs.microsoft.com/en-us/previous-versions/msp-n-p/gg430879(v=pandp.40)/?WT.mc_id=DX-MVP-5003606)
* [17: Getting Started Using the Prism Library 5.0 for WPF Hands-on Lab](https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff921141(v=pandp.40)/?WT.mc_id=DX-MVP-5003606)
* [18: Publishing and Updating Applications Using the Prism Library 5.0 for WPF Hands-on Lab](https://docs.microsoft.com/en-us/previous-versions/msp-n-p/gg405497(v=pandp.40)/?WT.mc_id=DX-MVP-5003606)
上面的是 Prism 5 的文件, 其實 Prism 4 的文件也差不多,我在部落格園上找到一份 Prism 4 的文件翻譯:
[Prism - 隨筆分類 - 西夏 - 部落格園](https://www.cnblogs.com/xixia/category/618180.html)
還有這份08年的文件,介紹了 Prism 最初的概念:
[Prism (Composite Application Guidance for WPF)](https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff648612(v=pandp.10)?WT.mc_id=WD-MVP-5003763)
## 3. Xamarin 中的 MVVM
![](https://img2020.cnblogs.com/blog/38937/202012/38937-20201208113725596-1983205162.png)
近幾年 Xamarin 的文件頗有活力,其中關於也有幾篇關於 MVVM 的內容:
- [The Model-View-ViewModel Pattern](https://docs.microsoft.com/zh-cn/xamarin/xamarin-forms/enterprise-application-patterns/mvvm/?WT.mc_id=WD-MVP-5003763)
- [Using the Model-View-ViewModel (MVVM) pattern in a Windows Store business app using C#, XAML, and Prism](https://docs.microsoft.com/en-us/previous-versions/windows/apps/xx130657(v=win.10)?WT.mc_id=WD-MVP-5003763)
- [第 18 章: MVVM](https://docs.microsoft.com/zh-cn/xamarin/xamarin-forms/creating-mobile-apps-xamarin-forms/summaries/chapter18/?WT.mc_id=WD-MVP-5003763)
- [從資料繫結到 MVVM](https://docs.microsoft.com/zh-cn/xamarin/xamarin-forms/xaml/xaml-basics/data-bindings-to-mvvm/?WT.mc_id=WD-MVP-5003763)
## 4. 資料繫結
![](https://img2020.cnblogs.com/blog/38937/202012/38937-20201208131450666-1975553231.png)
大致上關於 MVVM 的文件就是上面這些了。另外還需要確保資料繫結和命令的知識,它們是 MVVM 最基礎的概念,所以這方面的文件也可以看一看。
關於資料繫結,由於是 XAML 平臺的基礎,各個平臺的文件都寫得很詳細。Wpf 的資料繫結文章寫在一篇裡,預計閱讀時間長達38分鐘:
[Data binding overview in WPF](https://docs.microsoft.com/en-us/dotnet/desktop/wpf/data/data-binding-overview?WT.mc_id=WD-MVP-5003763)
Xamarin 的資料繫結文件相對友好,分成多篇文章:
[Xamarin.Forms 資料繫結](https://docs.microsoft.com/zh-cn/xamarin/xamarin-forms/app-fundamentals/data-binding/?WT.mc_id=WD-MVP-5003763)
![](https://img2020.cnblogs.com/blog/38937/202012/38937-20201208131507369-546763539.jpg)
比起 Wpf 和 Xamarin,我覺得 Uwp 的文件更有趣些,雖然 Uwp 的資料繫結和 Wpf 的有很多不同,但也很值得參考:
- [資料繫結概述](https://docs.microsoft.com/zh-cn/windows/uwp/data-binding/data-binding-quickstart?WT.mc_id=WD-MVP-5003763)
- [深入瞭解資料繫結](https://docs.microsoft.com/zh-cn/windows/uwp/data-binding/data-binding-in-depth?WT.mc_id=WD-MVP-5003763)
- [x:Bind 中的函式](https://docs.microsoft.com/zh-cn/windows/uwp/data-binding/function-bindings?WT.mc_id=WD-MVP-5003763)
- [教程:建立資料繫結](https://docs.microsoft.com/zh-cn/windows/uwp/data-binding/xaml-basics-data-binding?WT.mc_id=WD-MVP-5003763)
- [設計面圖上以及用於原型製作的示例資料](https://docs.microsoft.com/zh-cn/windows/uwp/data-binding/displaying-data-in-the-designer?WT.mc_id=WD-MVP-5003763)
- [繫結分層資料和建立大綱/細節檢視](https://docs.microsoft.com/zh-cn/windows/uwp/data-binding/how-to-bind-to-hierarchical-data-and-create-a-master-details-view?WT.mc_id=WD-MVP-5003763)
- [資料繫結和 MVVM](https://docs.microsoft.com/zh-cn/windows/uwp/data-binding/data-binding-and-mvvm?WT.mc_id=WD-MVP-5003763)
## 5. 其它
在稍微複雜一些的 XAML 中一個元素可能很難搞清楚自己的 DataContext,因為這涉及它的邏輯樹、Parent 的DataContext、DataTemplete 等。總之,使用 Binding 的元素需要搞清楚自己的定位。所以瞭解一下 [Data Templating](https://docs.microsoft.com/zh-cn/dotnet/desktop/wpf/data/data-templating-overview?WT.mc_id=WD-MVP-5003763) 和 [Trees in WPF](https://docs.microsoft.com/en-us/dotnet/desktop/wpf/advanced/trees-in-wpf?WT.mc_id=WD-MVP-5003763) 對做好 DataBinding 也會有幫助。
另外,只有少量的控制元件有對 ICommand 的處理,所以通過 [使用行為](https://docs.microsoft.com/zh-cn/previous-versions/visualstudio/design-tools/expression-studio-4/ee341381(v=expression.40)?WT.mc_id=WD-MVP-5003763) 將資料和事件轉換為 Command 的呼叫是實現 MVVM 必不可少的技能。
## 6. 最後
寫這篇文章的過程簡直成了大型考古,很開心有機會重溫這些當年幫了我很多的文件。可喜的是十年前的文章對 XAML 開發居然還有用,可悲的是十年前的文章對 XAML 開發居然還有用。
Microsoft Docs 儲存了多年來微軟各種技術文件的存檔,有興趣的話你也可以在這裡尋找到當年的回憶。