我很难理解 MVVM模式的ViewModel部分。我目前的方法是创建一个类,没有任何逻辑(重要),除了它实现 INotifyPropertyChanged 。该类只是属性的集合,如果您愿意,可以使用结构,尽可能地描述数据的一小部分。我认为这是我的模型。
我编写的大多数WPF代码都是配置所述模型的设置对话框。对话框的代码隐藏了一个返回Model实例的属性。在XAML代码中,我绑定到该属性的子属性,从而直接绑定到Model的属性。由于它实现了INotifyPropertyChanged,因此效果很好。我认为此设置对话框为查看。
然而,我还没有真正弄清楚ViewModel是什么。我读过的文章表明,ViewModel应该将View和Model绑定在一起,提供Model缺乏的逻辑,但仍然很复杂,直接进入View。它是否正确?在我的示例中,设置对话框的代码隐藏是否会被视为 ViewModel ?
我只是觉得有点失落,并希望我的同行们揭穿我的一些假设。我完全偏离了这里吗?
答案 0 :(得分:2)
由于您的模型完全适合您的视图,即您的视图(设置对话框)可以直接绑定到模型的数据结构,因此您处于不需要视图模型的幸运情况。 / p>
然而,还有许多其他情况并非如此:想象一下,视图是数据库表的直接映射,但是您需要一个与此抽象不完全匹配的用户界面。
以示例“设置对话框”为例,假设您的模型直接映射到包含setting_name
,setting_value
字段的数据库表。但是,在您看来,您不希望用户填写某些网格;相反,您希望用户填写一些“用户名”,“邮件地址”等字段。在这种情况下,您可以创建一个视图模型,公开UserName
,MailAddress
等属性,并在内部将它们映射到您的模型。
答案 1 :(得分:1)
您认为模型实际上是您的 ViewModel 。 ViewModel是支持View的类。它通常具有针对特定技术的API(例如WPF或SilverLight)。
因此,ViewModel可以具有ICommand属性,以及为数据绑定提供颜色或画笔的属性。它还可以具有控制特定控件是启用还是禁用,或者是否可见的属性。
所有这些都是面向视图的逻辑,因此存在于ViewModel中。
除玩具应用程序外,您还需要一个正确的域模型,但您不希望使用所有这些面向视图的逻辑来污染此模型。它不属于那里 - 您可能希望重用域模型来公开Web服务或网站,以及INotifyPropertyChanged,ICommand属性以及不属于那里的内容。
域模型是MVVM模式中的模型。 ViewModel在View和Model之间提供了 bridge 。
答案 2 :(得分:0)
ViewModel通常用于绑定那些影响View的视觉外观和行为的值。在这种特殊情况下,您将进一步抽象模型以仅表示设置数据,而不表示任何行为。例如,如果你有一个复选框,当选中它时会使几个滑块无效,ViewModel将提供启用/禁用这些滑块的逻辑,而不是View本身,而不是模型本身。
将设计分解为MVVM的一个有用方法是问问自己,假设我无法与测试中的视图进行交互,我将如何对我的视图行为进行单元测试?通常你会发现你的大多数行为实际上都与视图有关,除了功能测试之外,它们在很大程度上是不可测试的。
答案 3 :(得分:0)
模型是您数据的模型。 ViewModel 是查看的模型。 查看是Window
或Page
或DataTemplate
,通常在XAML中定义。
视图与视图模型之间存在紧密耦合。视图中的对象绑定到视图模型的属性。如果更改视图的设计,则将更改视图模型的设计。一般来说,视图模型是您使用而不是代码隐藏的方式。
视图模型和数据模型之间存在紧密耦合。视图模型实例通常包含对数据模型实例的引用。视图模型的属性更新数据模型实例中的属性,通常是在设置它们时。 (但不一定。例如,视图模型实现更新数据模型的基础实例的Command
或实现IEditableObject
并不罕见。)
视图和模型之间存在无耦合。您通常可以对模型进行实质性更改,只要它们没有用户界面含义,也不需要更改视图。您通常可以在不影响数据模型的情况下对UI的功能进行实质性更改(除非这些更改实际上需要数据模型中的新功能)。