所以在我没有真正关注新开发的一段时间之后我再次研究MVVM,并且我注意到教程/指南等的数量已经大大增加。然而,MVVM的大多数示例/示例实现都缺乏解释我不太清楚的东西。所有这些示例都非常简单,它们都没有从数据库/文件/等中读取内容。
现在举个例子我有一些类似绘画的应用程序,我将这些绘画保存在XAML中。什么属于ViewModel什么属于模型?
Model提供的功能是从/向XAML文件加载/保存绘画?
ViewModel是否绑定到模型公开的属性(颜色,宽度,位置等)?
验证是在模型中还是在ViewModel中进行?
答案 0 :(得分:2)
ViewModel是模型的表示,适用于您正在使用的演示技术。
在您的示例中,我相信模型不会提供从/向XAML文件加载/保存绘画的功能。这将在数据访问对象/存储库中执行,ViewModel将模型实例作为输入调用。这个位通常是可变的,取决于你的Model类的样子。
ViewModel本身通常不使用数据绑定。它只是以一种有助于演示(View)技术的方式将Model公开给View。在WPF / Silverlight的情况下,它基本上意味着它实现了INotifyPropertyChanged接口。
验证通常由View(几乎所有内容)启动,在ViewModel中执行,但通常由ViewModel委派给Model。当然,最好不要在整个申请过程中重复验证。常见验证的最佳位置是Model(请参阅IDataErrorInfo)。但是,ViewModel特有的验证可以直接在ViewModel中处理。
答案 1 :(得分:0)
从一方面来说,ViewModel可以是Model对象的包装器,并使用演示文稿详细信息来扩展它。例如,如果你有Model对象 - Pen,那么PenViewModel可以包含IsSelected,IsDragging属性等。这是 ViewModel as wrapper 。
另一方面,ViewModel可能是View的抽象,它不包含对特定控件的引用。不要忘记MVVM的目标之一是单元测试。例如,您的绘画应用程序中有可拖动的条形图。因此,您可以使用ViewModel集合抽象此功能:BarViewModel {IsSnapped,Position,IsEnabled},BrushBarViewModel:BarViewModel,PenBarViewModel等。然后您可以使用单元测试来覆盖此功能,但所有这些都与Model无关。这是 ViewModel as View abstraction 。
模型非常接近商业,包含业务实体和逻辑,类来持久化实体,服务。您可以在模型中使用不同的概念,例如DDD(领域驱动设计),Fawler的企业模式,CQRS(命令查询责任分离),SOA(面向服务的体系结构)。
使用绑定机制查看与ViewModel(模型)的同步状态,最糟糕的情况是代码隐藏,如在PresentationModel模式中。
基于此,回答你的问题将是:
Model提供的功能是从/向XAML文件加载/保存绘画吗?
没有。 Model没有直接引用任何XAML文件。
ViewModel是否绑定到模型公开的属性(颜色,宽度,位置等)?
没有。绑定是View同步的机制。因此,您需要将View绑定到这些属性。您可以将View直接绑定到Model或ViewModel包装器。
验证是在模型中还是在ViewModel中进行?
Wherenever。如果您的控制支持验证,您可以在View图层上验证,例如DateTimePicker不允许选择不正确的日期。您可以在ViewModel中编写自定义验证逻辑,并使用单元测试覆盖它。此外,验证可以在模型级别,作为附加检查,因为模型不能处于无效状态。