【问题标题】:MVVM "binder" definition and its usage?MVVM“绑定器”定义及其用法?
【发布时间】:2016-03-07 22:21:13
【问题描述】:

我一直在互联网上四处寻找,以更好地了解MVVM

Wikipedia 上,它指出MVVM 模式的组成部分是:

  • 型号
  • 查看
  • 查看模型
  • 活页夹

这是我第一次遇到binder 定义以及作为首字母缩略词一部分的modelviewview-model

MVVM维基百科定义 的“活页夹”声明如下:

声明性数据和命令绑定隐含在 MVVM 模式中。在Microsoft 解决方案堆栈中,binder 是一个名为XAMLmarkup language。 binder 使开发人员不必编写样板逻辑来同步view modelview。 当在Microsoft 堆栈之外实现时,声明性databinding 技术的存在是该模式的关键促成因素。

问题:是否每个MVVM 模式总是包含binderbinder 究竟是做什么用的? 是您实际编码的东西,还是framework 只是进行了一些自动化操作?

我几乎每天都在工作和使用AngularJS,有些人同意它的模式是MVVM,而不是MVC/MVP。我知道View Model 就是AngularJS 所称的"Controller",作为对“经典”MVC 的回忆。 但是AngularJS 也使用binder 吗?我在AngularJS 中编码时仍然没有看到类似的东西,也许binder 只是用于桌面编程框架而不是浏览器?

在维基百科上,它给出了WPFXAMl 作为C#binder 示例,那么AngularJS 的反例是什么? AngularJStemplates 和/或他们的syntax 也是view 和/或binder

您能否对维基百科的文章提供更好的解释,也许可以举几个例子(AngularJS 和/或WPF)?

编辑:我在SO 上查看了更多内容,发现these slides 的点赞是MVB 而不是MVVM,所以:这是binder 我们'正在谈论一个可选项,它是否同时出现在MVVMMVB 中?

binder 是否只是指data-bindingViewView-Model 之间进行?您将如何在图表上表示 binder?是不是和this one上的“数据绑定”一样?

谢谢。

【问题讨论】:

  • 维基文章写得很糟糕,如果他们将活页夹/绑定和 xaml 混为一谈。
  • 我同意。这就是为什么我很困惑并在这里问的原因

标签: javascript angularjs design-patterns model-view-controller mvvm


【解决方案1】:

“绑定”是某种东西,它描述了视图模型中的数据将如何在视图中显示。 “绑定器”是执行绑定描述的操作的一些组件。 Binder 对 MVVM 框架很重要,因为它们允许您将 View 与 ViewModel 分离,并承担处理两者之间状态同步的权重。

活页夹执行以下操作

  • 解释(通常)在 UI 中定义的绑定
  • 观察视图模型的状态变化并更新视图
  • 观察视图的状态变化并更新视图模型

注意,初始状态的引入也是状态的改变,更新的行为取决于对绑定的解释。

据我所知,没有一种编程语言将 binding 的概念融入到语言中(即,通过语言特性同步对象的两个实例的状态,例如观察者模式作为 events 被烘焙到 C# 中,因此在设计实现 MVVM 模式的系统时必须对绑定器进行编码。

如您的问题所述,维基百科对活页夹的定义很糟糕。他们将标记语言与绑定行为混为一谈。 WPF 的标记语言 Xaml 只是描述对象图的 XML。它通过添加 markup extensions 来扩展 xml,这些是通过专门格式化的属性值定义的。

<!-- Attributes that are curly bracketed {} are markup extensions -->
<TextBox x:Name="My textbox lol" Text="{Binding Name}" />

xaml 反序列化器将这些特殊属性识别为标记扩展,它们实际上是扩展MarkupExtension 的类。 xaml 反序列化程序将它们包含在反序列化过程中。上面示例中的 Binding 类是 MarkupExtension 类型,并且是 WPF 中绑定器的主要(但不是唯一!)实现。

WPF 中的绑定系统非常复杂。它主要基于 DependencyProperties,但可以与INotifyPropertyChanged properties 很好地交互,并且可以以有限的方式与POCO 属性交互。在反序列化期间,这些绑定被实例化并按照标记中的描述进行配置,然后使用绑定子系统将视图和视图模型绑定在一起。

我对淘汰赛比对 Angular 更熟悉,但过程相似。您在 UI 中定义绑定,框架在 DOM 构建后不久的某个时间点对其进行解释。这是由框架本身确定的某种机制触发的。然后框架解释这些绑定,以便将 View Model 中的可观察属性与 UI 绑定。

如果没有这种解释工作,您的绑定定义将只存在于您的 HTML 中,什么都不做。有些东西必须解释它们并设置将处理状态同步的绑定。

在 Knockout 中,当您调用 ko.applyBindings() 并传入您的视图模型时,就会发生这种情况。如果不调用它,所有 data-bind 绑定定义将在您的 html 中未使用。

这个过程在每个框架中是如何发生的,它是如何实现的,以及每个框架调用它们的绑定,都可能不同。

【讨论】:

  • 不错的答案。不过,确实应该有人编辑维基百科的文章。
  • 所以活页夹是始终存在于 MVVM 模式中的东西,但它通常与您正在使用的框架相关。如果您使用框架,通常不必自己编写代码,对吗?
  • @Zorgatone 每个 MVVM 框架都会有执行绑定器操作的代码。他们如何称呼它们以及如何实现它们取决于框架。几乎使用 MVVM 框架的唯一原因是能够将视图绑定到视图模型。我敢打赌每个 MVVM 框架的 80% 都在绑定系统中。它使您可以简单地描述绑定,而无需自己处理侦听器的订阅/取消订阅。
  • 不错,正如我所想。谢谢朋友
【解决方案2】:

维基百科并不是一切的来源。首先,阅读 WPF 和 Silverlight 的架构师 John Gossman 的这篇博文: Introduction to Model/View/ViewModel pattern for building WPF apps
看?那里没有任何“粘合剂”。他写的是:

Model/View/ViewModel 还依赖于另一件事:数据绑定的通用机制。

要了解 MVVM 的真正含义,请阅读这篇文章的第一句话:

Model/View/ViewModel 是 Model/View/Controller (MVC) 的一种变体,专为现代 UI 开发平台量身定制,在这些平台上,View 由设计师而非经典开发人员负责。

绑定机制不是模式本身的一部分。它是一种底层技术,对于应用该模式至关重要。

【讨论】:

  • 是的。我现在明白了。我问是因为我发现维基百科真的让我很困惑
  • 我无法找到有关活页夹本身的任何信息。所以我认为维基百科上的某些东西是错误的。感谢您的澄清
猜你喜欢
  • 2019-09-07
  • 1970-01-01
  • 2013-02-12
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 2020-07-28
  • 2012-08-29
  • 1970-01-01
相关资源
最近更新 更多