.Net 中的 MVVM 与 Cocoa 中的 MVC 有何不同?

Posted

技术标签:

【中文标题】.Net 中的 MVVM 与 Cocoa 中的 MVC 有何不同?【英文标题】:How is MVVM in .Net different than MVC in Cocoa? 【发布时间】:2011-08-17 10:45:48 【问题描述】:

我正在阅读有关 MVVM 的内容,但我一生都无法说出 MVVM 的“模型视图”与 Cocoa 编程中使用的 MVC 中的“控制器”有何根本不同。

我什至读过一些解释,这些解释对其他人来说是“啊哈”的时刻,但仍然未能发现其中的区别。我所做的有限的 Cocoa GUI 编程涉及将控制器作为管理数据的中心点,使用键值观察来管理从视图到模型的数据。

在所有重要方面,在我看来,这似乎是“模型视图”的作用,只是它可能是与 .Net 中的 WPF C# 桥相关的细微实现差异。也就是说,如果 Cocoa GUI 是用与应用程序代码不同的语言指定的,并且控制器是用与 GUI 相同的语言而不是应用程序编码的(即 WPF 在 XAML 而不是C#)。

或者也许在非 Cocoa 环境中的 MVC,没有所有的键值观察等,与在 Cocoa 中应用的 MVC 有很大不同,这导致人们发现 MVVM 和 MVC 之间的差异比我所拥有的更大。

我疯了吗?请教育我。

【问题讨论】:

了解如何接受答案:***.com/faq#howtoask。如果您没有得到正确答案,请编辑您的问题并添加更多信息。 可能重复:***.com/questions/667781/… 我读过那个帖子。我不认为它是重复的,因为当它提到“common MVC”模式时,我不确定它是否指的是在 Cocoa + Obj-C 中实现的 MVC。做更多的研究,似乎 Apple 的 MVC 更像 MVP,而 MVVM 是 MVP 的一个微妙转折,涉及到用 GUI 特定语言设计 GUI... 【参考方案1】:

多年来,我一直是 WPF 中 MVVM 的忠实拥护者,并且最近在 Cocoa 中学习了 MVC。起初它们看起来相同,然后相似,而现在随着我与 Cocoa 的合作越来越多,完全不同了。

我的感觉是,区别在于绑定的方向。

在 MVVM 中,视图绑定到 ViewModel 对象 (V -> VM) 上的属性。更改 ViewModel 对象的属性,并通过使用 NotifyPropertyChanged 的​​一些小技巧,View 神奇地自我更新。 View 被动地读取 View Model 对象中的属性,而 ViewModel 对 View 完全一无所知 - 你可以删除 View,它仍然可以工作。这使您可以灵活地重写、更改或组合视图,并让它们“正常工作”,而无需更改一行视图模型代码。

在 Cocoa (ios) 下的 MVC 中,视图控制器通过显式 IBAction/IBOutlet 属性将自身绑定到视图 (VC -> V) - 您在视图控制器中可以直接引用视图对象。您直接告诉视图上的控件在视图控制器中进行更改,并且 ViewController 对视图的内部有深入的了解。删除 View,ViewController 会抛出运行时异常。

对我来说,这是关于绑定的方向。

使用 Cocoa 使用 MVC 模式,您可以通过视图控制器直接“控制”视图(按道理说,对吗?)。

在 MVVM/WPF 中,您可以通过监视 ViewModel 对象的更改来更新视图控件 - 绑定是相反的并且是被动的。

没有 MVVM 的 WPF 就像 iOS 的 Cocoa MVC,感觉有点像 ASP.NET 表单。

Cocoa for OSX 确实有一个更类似于 MVVM 的绑定策略可用,但在 iOS 上不可用。

【讨论】:

这似乎与我发现的相符。当我第一次找到用于 MVVM Web 应用程序的 Knockout.js 框架时,我最初提出了这个问题。从那以后我发现 MVVM 的问题是,绑定的方向鼓励视图中的小代码 sn-ps,或 ViewModel 上的无关属性以简化绑定。最后,我经常最终使用 MVC,因为我认为可以公平地说,使用可观察值,两者都“神奇地”更新了 UI。对于视图控制器在未绑定时抛出异常的情况......不会因为向 nil 发送消息而被忽略吗?

以上是关于.Net 中的 MVVM 与 Cocoa 中的 MVC 有何不同?的主要内容,如果未能解决你的问题,请参考以下文章

02-Vue单向数据绑定与双向数据绑定

02-Vue单向数据绑定与双向数据绑定

02-Vue单向数据绑定与双向数据绑定

02-Vue单向数据绑定与双向数据绑定

MVVM理解

Swift 命令行程序中的 CFRunLoop