MVVM概念的混乱

时间:2014-01-22 07:02:55

标签: wpf xaml mvvm windows-phone-8 inotifypropertychanged

我试图了解过去两周的MVVM,但仍然有很多困惑理解它。

我最近开始使用Windows Phone 8开发。

我对 MVVM

的理解

M =模型意味着数据,具体意味着什么是模型应被视为结构的C 语言。它只有属性或成员变量(对象)。它对View和View Model一无所知。

V =普通XAML。应该只有一种绑定方式,即使用DataContext

VM = View Model是视图的模型。 VM使用M来保存其数据(使用 Containership ),VM负责将数据保存在DB中或从db中获取数据。 数据库交互应该在VM中进行。 VM应该实现INotifyPropertyChanged,因为它负责保存和获取数据。

请说明,我对MVVM有错误的概念。

3 个答案:

答案 0 :(得分:5)

你所说的一切在技术上都是正确的,但我会尝试以更抽象的方式处理设计模式,并思考它试图解决的问题。 MVVM正试图解决在视图和模型之间提供分离的问题以及提供双向绑定(即从模型中提取数据并呈现它,以及获取用户输入并保存回到模特)。

大多数模式都希望将视图和模型分开,因此在MVVM中仍然是相同的,但更为模糊的是如何转换/格式化数据以便显示给用户,以及如何将用户输入转换为模型。在许多MVC框架中,视图中模型数据的表示处理得很好,但是您通常可以自己进行用户输入并将数据转换回模型。 MVVM旨在处理两者。

Microsoft选择使用DependencyProperty,ICommand和ValueConverters之类的东西来做到这一点。基本思想是您的View只会通过绑定松散地附加到ViewModel,因此理论上您可以将ViewModel重用于其他视图。这在另一个方向上是相同的(这种干净的双向绑定是使MVVM与MVC不同的原因),因为你的VM可以通知属性已经改变(这就是为什么你必须实现INotifyPropertyChanged),但VM有不知道视图是否有反应。当你想重用这些组件时,这非常简单。

因此,了解MS尝试使用MVVM解决的问题,您可以更好地理解为什么INotifyPropertyChanged存在的原因或者ICommand的用途,并希望能够充分利用MVVM模式。

答案 1 :(得分:2)

我自2008年以来一直在使用MVVM,你的解释主要是我向那些没有使用MVVM或任何MV *模式的人解释。

正如迈克尔所说,核心问题是将视图与逻辑分开,因为所有MV *框架的目标都是如此,但在如何实现这一目标方面存在细微差别。随着WPF的出现,XAML将数据绑定带到了一个全新的水平,现在我们几乎可以绑定任何东西,而不会直接依赖数据。

在MVC中,我们有控制器“告诉”视图要做什么,在MVVM中视图监听ViewModel所说的内容,例如。 ViewModel的IsDirty属性表示数据已更改,然后视图有一种可视化方式。这不是ViewModels告诉视图要做什么的工作,它是监视ViewModel中的更改的视图。这通过两种方式绑定输入控件来反过来。 ViewModel不知道这些数据是如何产生的,它只规定它应该是什么类型。

当我尝试解释用MVVM编写的更复杂的项目时,我将ViewModels划分为两个不同的子类型; WrapperViewModels,LogicViewModels。

  • WrapperViewModel:这是一个或多或少只是在模型上构成的ViewModel。它包含与PropertyChanged逻辑一起公开数据的属性。它包含用于暴露的逻辑,例如。当模型只有FirstName和LastName等时,FullName可以通过在模型中实现INotifyPropertyChanged来替换。但在所有情况下,它可能不是最好的方法。

  • LogicViewModel:这些VM是包含应用程序逻辑的VM。作为应用程序核心的MainViewModel就是其中的一个例子。如果您将应用程序视为一组岛屿,其中每个岛屿负责应用程序的一部分,则此部分通常具有自己的LogicViewModel

当涉及到Model层时,我通常会说以下逻辑存在于该层中;数据,DatabaseAccess,ServiceAccess,FileAccess。基本上所有代码都与应用程序外部的内容有关或进入。我不会在ViewModel中编写任何逻辑,直接访问除Model对象和其他ViewModel之外的任何东西。

有些情况下,MVVM往往会使一些简单的任务变得过于复杂。在这些场景中,我建议考虑从视图和视图模型中进行真正的控制。这样做可以重用控件并完全控制它的内部。其他简化MVVM开发并且几乎是强制性的事情是知道messenger / mediator模式,依赖注入和行为/触发器/动作/附加属性。

大多数人都说,View应该是纯Xaml,没有逻辑,所以永远都是如此。在我看来,这是完全错误的。只要您遵循View不应了解ViewModel逻辑的原则,就允许在View中使用代码/逻辑。由于逻辑逻辑纯粹是为了利用表示,所以可以,但只要你有一个ViewModel类的引用就可以了。

答案 2 :(得分:0)

我倾向于将MVVM描述为Model View Presenter的增长。在模型视图展示器中,Presenter获取模型并构建视图。更改模型,视图也会更改。 MVP不可能更简单,这就是我开始使用它的原因!

ViewModel是单向Presenter的替代品:它是一个状态跟踪双向等价物。除了观察模型的更改外,它还可以监视事件和视图的更改,并提供更新模型系统的粘合剂和逻辑。

这是从技术细节中删除的更通用的答案,并且希望它能够在这个想法中做出尊重的工作。