<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=MVVM</id>
	<title>MVVM - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=MVVM"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=MVVM&amp;action=history"/>
	<updated>2026-07-14T04:19:42Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=MVVM&amp;diff=2975522&amp;oldid=prev</id>
		<title>~2025-43541-18：​維護清理；Fix HTML dl tag (&quot;;&quot; and &quot;:&quot;)</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=MVVM&amp;diff=2975522&amp;oldid=prev"/>
		<updated>2025-12-28T09:06:16Z</updated>

		<summary type="html">&lt;p&gt;維護清理；Fix HTML dl tag (&amp;quot;;&amp;quot; and &amp;quot;:&amp;quot;)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{NoteTA&lt;br /&gt;
| G1 = IT&lt;br /&gt;
| 1 = zh-cn:访问; zh-tw:存取;&lt;br /&gt;
| 2 = zh-cn:周期; zh-tw:週期;&lt;br /&gt;
| 3 = zh-cn:通过; zh-tw:透過;&lt;br /&gt;
| 4 = zh-cn:代码; zh-tw:原始碼;&lt;br /&gt;
| 5 = zh:置标语言; zh-cn:标记语言; zh-tw:標記語言;&lt;br /&gt;
| 6 = zh:标记语言; zh-cn:标记语言; zh-tw:標記語言;&lt;br /&gt;
}}&lt;br /&gt;
[[File:MVVMPattern.png|thumb|upright=1.5]]&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;MVVM&amp;#039;&amp;#039;&amp;#039;（{{lang|en|&amp;#039;&amp;#039;&amp;#039;Model–view–viewmodel&amp;#039;&amp;#039;&amp;#039;}}）是一种软件[[架构模式]]。&lt;br /&gt;
&lt;br /&gt;
MVVM有助于将[[图形用户界面]]的开发与[[业务逻辑]]或[[前端和后端|后端]]逻辑（&amp;lt;u&amp;gt;数据模型&amp;lt;/u&amp;gt;）的开发[[关注点分离|分离]]开来，这是通过[[置标语言]]或GUI代码实现的。MVVM的&amp;lt;u&amp;gt;视图模型&amp;lt;/u&amp;gt;是一个值转换器，&amp;lt;ref name=&amp;quot;MVVM-eliminates-valueconverters&amp;quot;&amp;gt;{{cite web|url=https://groups.google.com/forum/#!topic/wpf-disciples/P-JwzRB_GE8|title=Thought: MVVM eliminates 99% of the need for ValueConverters|author=Google groups|accessdate=2017-11-19|archive-date=2011-01-22|archive-url=http://arquivo.pt/wayback/20110122130054/https://groups.google.com/forum/#!topic/wpf-disciples/P-JwzRB_GE8|dead-url=no}}&amp;lt;/ref&amp;gt; 这意味着视图模型负责从模型中暴露（转换）[[对象 (计算机科学)|数据对象]]，以便轻松管理和呈现对象。在这方面，视图模型比视图做得更多，并且处理大部分视图的显示逻辑。&amp;lt;ref name=&amp;quot;MVVM-eliminates-valueconverters&amp;quot;/&amp;gt; 视图模型可以实现[[中介者模式]]，组织对视图所支持的[[用例]]集的后端逻辑的访问。&lt;br /&gt;
&lt;br /&gt;
MVVM是[[马丁·福勒]]的PM（{{lang|en|Presentation Model}}）设计模式的变体。&amp;lt;ref&amp;gt;{{cite web|url=http://martinfowler.com/eaaDev/PresentationModel.html|title=The Presentation Model Design Pattern|publisher=Martin Fowler.com|author=Martin Fowler|date=19 July 2004|accessdate=2017-11-19|archive-date=2021-01-26|archive-url=https://web.archive.org/web/20210126153226/https://martinfowler.com/eaaDev/PresentationModel.html|dead-url=no}}&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;JoshSmith&amp;quot;&amp;gt;{{cite journal |last=Smith |first=Josh |url=http://msdn.microsoft.com/en-us/magazine/dd419663.aspx |title=WPF Apps with the Model-View-ViewModel Design Pattern |journal=MSDN Magazine |date=February 2009 |access-date=2017-11-19 |archive-date=2019-10-31 |archive-url=https://web.archive.org/web/20191031143417/https://msdn.microsoft.com/en-us/magazine/dd419663.aspx |dead-url=no }}&amp;lt;/ref&amp;gt; MVVM以相同的方式抽象出视图的状态和行为，&amp;lt;ref name=&amp;quot;JoshSmith&amp;quot;/&amp;gt; 但PM以&amp;lt;u&amp;gt;不&amp;lt;/u&amp;gt;依赖于特定用户界面平台的方式抽象出视图（建立了&amp;lt;u&amp;gt;视图模型&amp;lt;/u&amp;gt;）。&lt;br /&gt;
&lt;br /&gt;
MVVM和PM都来自[[MVC]]模式。&lt;br /&gt;
&lt;br /&gt;
MVVM由[[微软]]架构师Ken Cooper和Ted Peters开发，通过利用[[Windows Presentation Foundation|WPF]]（微软[[.NET框架|.NET]]图形系统）和[[Microsoft Silverlight|Silverlight]]（WPF的互联网应用程序衍生品）的特性来简化用户界面的[[事件驅動程式設計]]。&amp;lt;ref name=&amp;quot;JoshSmith&amp;quot;/&amp;gt; 微软的WPF和Silverlight架构师之一John Gossman于2005年在他的博客上发表了MVVM。&lt;br /&gt;
&lt;br /&gt;
MVVM也被称为&amp;#039;&amp;#039;&amp;#039;model-view-binder&amp;#039;&amp;#039;&amp;#039;，特别是在不涉及.NET平台的实现中。[[ZK]]（Java写的一个[[Web应用框架]]）和[[KnockoutJS]]（一个[[JavaScript]][[函式庫|库]]）使用model-view-binder。&amp;lt;ref name=&amp;quot;JoshSmith&amp;quot;/&amp;gt;&amp;lt;ref name=&amp;quot;SMassey&amp;quot;&amp;gt;{{cite web|last=Massey|first=Simon|title=Presentation Patterns in ZK|url=http://www.slideshare.net/simbo1905/design-patterns-in-zk-java-mvvm-as-modelviewbinder|accessdate=24 March 2012|archive-date=2020-08-13|archive-url=https://web.archive.org/web/20200813170855/https://www.slideshare.net/simbo1905/design-patterns-in-zk-java-mvvm-as-modelviewbinder|dead-url=no}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cite web |author = Steve Sanderson |title = KnockoutJS |url = http://knockoutjs.com/documentation/observables.html |accessdate = 2017-11-19 |archive-date = 2020-08-16 |archive-url = https://web.archive.org/web/20200816151030/https://knockoutjs.com/documentation/observables.html |dead-url = no }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MVVM模式的组成部分 ==&lt;br /&gt;
; 模型&lt;br /&gt;
: 模型是指代表真实状态内容的[[领域模型]]（面向对象），或指代表内容的[[数据访问层]]（以数据为中心）。&lt;br /&gt;
; 视图&lt;br /&gt;
: 就像在[[MVC]]和[[Model-view-presenter|MVP]]模式中一样，视图是用户在屏幕上看到的结构、布局和外观（UI）。&amp;lt;ref&amp;gt;{{Cite web|url=https://msdn.microsoft.com/en-us/library/hh848246.aspx|title=The MVVM Pattern|website=msdn.microsoft.com|access-date=2016-08-29|archive-date=2017-08-25|archive-url=https://web.archive.org/web/20170825145942/https://msdn.microsoft.com/en-us/library/hh848246.aspx|dead-url=no}}&amp;lt;/ref&amp;gt; &lt;br /&gt;
; 视图模型&lt;br /&gt;
: 视图模型是暴露公共属性和命令的视图的抽象。MVVM没有MVC模式的控制器，也没有MVP模式的presenter，有的是一个&amp;#039;&amp;#039;绑定器&amp;#039;&amp;#039;。在视图模型中，绑定器在视图和{{le|数据绑定器|Data binding}}之间进行通信。&amp;lt;ref&amp;gt;{{cite web |author = Pete Weissbrod |title = Model-View-ViewModel Pattern for WPF: Yet another approach. |url = http://www.acceptedeclectic.com/2008/01/model-view-viewmodel-pattern-for-wpf.html |archiveurl = https://web.archive.org/web/20080201101909/http://www.acceptedeclectic.com/2008/01/model-view-viewmodel-pattern-for-wpf.html |archivedate = 2008-02-01 |accessdate = 2017-11-19 |dead-url = yes }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
; 绑定器&lt;br /&gt;
: 声明性数据和命令绑定隐含在MVVM模式中。在Microsoft{{le|解决方案堆|solution stack}}中，绑定器是一种名为[[XAML]]的[[置标语言|标记语言]]。&amp;lt;ref&amp;gt;{{cite web|last=Wildermuth|first=Shawn|title=Windows Presentation Foundation Data Binding: Part 1|url=http://msdn.microsoft.com/en-us/library/aa480224.aspx|publisher=Microsoft|accessdate=24 March 2012|archive-date=2018-08-29|archive-url=https://web.archive.org/web/20180829212138/https://msdn.microsoft.com/en-us/library/aa480224.aspx|dead-url=no}}&amp;lt;/ref&amp;gt; 绑定器使开发人员免于被迫编写样板式逻辑来同步视图模型和视图。在微软的堆之外实现时，声明性数据绑定技术的出现是实现该模式的一个关键因素。&amp;lt;ref name=&amp;quot;SMassey&amp;quot;/&amp;gt;&amp;lt;ref&amp;gt;{{cite web|title=ZK MVVM|url=http://books.zkoss.org/wiki/Small_Talks/2012/February/New_Features_of_ZK_6#ZK_MVVM|publisher=Potix|accessdate=24 March 2012|archive-date=2016-03-18|archive-url=https://web.archive.org/web/20160318174806/http://books.zkoss.org/wiki/Small_Talks/2012/February/New_Features_of_ZK_6#ZK_MVVM|dead-url=no}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 理论基础 ==&lt;br /&gt;
MVVM旨在利用WPF中的[[数据绑定]]函数，通过从视图层中几乎删除所有[[图形用户界面|GUI]]代码（[[ASP.NET|代码隐藏]]），更好地促进视图层开发与模式其余部分的分离。&amp;lt;ref name = &amp;quot;JSmith&amp;quot;&amp;gt;{{cite web|author= Josh Smith|title= WPF Apps With The Model-View-ViewModel Design Pattern|url= http://msdn.microsoft.com/en-us/magazine/dd419663.aspx|accessdate= 2017-11-19|archive-date= 2019-10-31|archive-url= https://web.archive.org/web/20191031143417/https://msdn.microsoft.com/en-us/magazine/dd419663.aspx|dead-url= no}}&amp;lt;/ref&amp;gt; 不需要[[用户体验设计|用户体验]]（UX）开发人员编写GUI代码，他们可以使用框架标记语言（如[[XAML]]），并创建到应用程序开发人员编写和维护的视图模型的数据绑定。角色的分离使得交互设计师可以专注于用户体验需求，而不是对业务逻辑进行编程。这样，应用程序的层次可以在多个工作流中进行开发以提高生产力。即使一个开发人员在整个代码库上工作，视图与模型的适当分离也会更加高效，因为基于最终用户反馈，用户界面通常在开发周期中经常发生变化，而且处于开发周期后期。&lt;br /&gt;
&lt;br /&gt;
MVVM模式试图获得MVC提供的功能性开发分离的两个优点，同时利用[[数据绑定]]的优势和通过绑定数据的框架尽可能接近纯应用程序模型。&amp;lt;ref name = &amp;quot;JSmith&amp;quot; /&amp;gt;&amp;lt;ref&amp;gt;{{cite journal|author= John Gossman|title= Tales from the Smart Client: Introduction to Model/View/ViewModel pattern for building WPF apps|url= http://blogs.msdn.com/johngossman/archive/2005/10/08/478683.aspx|access-date= 2017-11-19|archive-date= 2010-01-25|archive-url= https://web.archive.org/web/20100125220430/http://blogs.msdn.com/johngossman/archive/2005/10/08/478683.aspx|dead-url= no}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cite web|author = Karl Shifflett|title = Learning WPF M-V-VM.|url = http://karlshifflett.wordpress.com/2008/11/08/learning-wpf-m-v-vm/|deadurl = yes|archiveurl = https://web.archive.org/web/20090413205731/http://karlshifflett.wordpress.com/2008/11/08/learning-wpf-m-v-vm/|archivedate = 2009-04-13|accessdate = 2017-11-19}}&amp;lt;/ref&amp;gt; 它使用绑定器、视图模型和任何业务层的数据检查功能来验证传入的数据。结果是模型和框架驱动尽可能多的操作，消除或最小化直接操纵视图的应用程序逻辑（如代码隐藏）。&lt;br /&gt;
&lt;br /&gt;
MVVM模式不同于MVC，在MVVM模式中，将ViewModel层绑定到View层后，它基本不使用点击事件，而是使用命令（command）来控制。数据的显示也是不同于MVC，而是使用Binding来绑定相关数据。&lt;br /&gt;
&lt;br /&gt;
值得一提的是，MVVM通常会使用属性更改通知，即数据驱动而不是事件驱动。在WPF中当数据发生改变时，会通过接口INotifyPropertyChanged通知到对应的组件绑定的数据，实现同步数据刷新。&lt;br /&gt;
&lt;br /&gt;
== 批评 ==&lt;br /&gt;
对这种模式的批评来自MVVM的创造者John Gossman本人，&amp;lt;ref&amp;gt;{{cite journal| author= John Gossman| title= Tales from the Smart Client: Advantages and disadvantages of M-V-VM| url= http://blogs.msdn.com/b/johngossman/archive/2006/03/04/543695.aspx| access-date= 2017-11-19| archive-date= 2011-08-16| archive-url= https://web.archive.org/web/20110816014850/http://blogs.msdn.com/b/johngossman/archive/2006/03/04/543695.aspx| dead-url= no}}&amp;lt;/ref&amp;gt;他指出，实现MVVM的开销对于简单的UI操作是“过度的”。他说，对于更大的应用来说，推广ViewModel变得更加困难。而且，他说明了非常大的应用程序中的数据绑定会导致相当大的内存消耗。&lt;br /&gt;
&lt;br /&gt;
== .NET中的实现 ==&lt;br /&gt;
=== .NET框架 ===&lt;br /&gt;
* {{le|MVVM基金会|MVVM Foundation}}&lt;br /&gt;
* [https://www.dotvvm.com/ DotVVM] {{Wayback|url=https://www.dotvvm.com/ |date=20210203131020 }}开源项目&lt;br /&gt;
&lt;br /&gt;
== 参见 ==&lt;br /&gt;
* [[多层架构]]&lt;br /&gt;
* [[MVC|Model–view–controller]]&lt;br /&gt;
* [[Model-view-presenter|Model–view–presenter]]&lt;br /&gt;
* [[Ember.js]]&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;br /&gt;
{{Reflist}}&lt;br /&gt;
&lt;br /&gt;
== 外部链接 ==&lt;br /&gt;
* {{cite web |url=https://code.msdn.microsoft.com/How-to-implement-MVVM-71a65441 |title=How to implement MVVM (Model-View-ViewModel) in TDD (test-driven development) |website=[[微软开发者网络|Microsoft Developer Network]] |publisher=Microsoft |accessdate=2017-11-19 |archive-date=2019-04-15 |archive-url=https://web.archive.org/web/20190415052927/https://code.msdn.microsoft.com/How-to-implement-MVVM-71a65441 |dead-url=no }}&lt;br /&gt;
* [https://github.com/simbo1905/ZkToDo2/blob/b97b353d399ad012577bef7f880f9e3167ed70a3/src/main/java/org/zkforge/zktodo2/ZkToDoViewModel.java MVVM validation logic] {{Wayback|url=https://github.com/simbo1905/ZkToDo2/blob/b97b353d399ad012577bef7f880f9e3167ed70a3/src/main/java/org/zkforge/zktodo2/ZkToDoViewModel.java |date=20200813164637 }}, written in Java by Tim Clare&lt;br /&gt;
* {{cite web |url=http://addyosmani.com/blog/understanding-mvvm-a-guide-for-javascript-developers/ |title=Understanding MVVM: A Guide for JavaScript Developers |website=AddysOnmani.com |accessdate=2017-11-19 |archive-date=2014-07-06 |archive-url=https://web.archive.org/web/20140706190026/http://addyosmani.com/blog/understanding-mvvm-a-guide-for-javascript-developers/ |dead-url=no }}&lt;br /&gt;
* {{cite web |url=http://www.learnmvvm.com/ |title=MVVM Step by step tutorial |website=learnmvvm.com |accessdate=2017-11-19 |archive-date=2020-02-05 |archive-url=https://web.archive.org/web/20200205124851/http://www.learnmvvm.com/ |dead-url=no }}&lt;br /&gt;
&lt;br /&gt;
{{網頁設計}}&lt;br /&gt;
&lt;br /&gt;
[[Category:软件设计模式]]&lt;br /&gt;
[[Category:.NET框架術語]]&lt;/div&gt;</summary>
		<author><name>~2025-43541-18</name></author>
	</entry>
</feed>