所以我一直在寻找一段时间,我在模型部分的所有搜索都让我感到困惑。
我已经看到许多示例,其中视图模型直接引用模型,然后设置模型的成员变量。但是,该模型不应该是业务对象,以便业务层可以使用该数据进行计算吗?
因此...
1)我是否应该在UI和Business层之间共享模型,因此两者都引用完全相同的对象(不应该每个层“隐藏”彼此的内容,在这种情况下这不是最好的。)< / p>
2)或者模型应该在业务层中。然后,UI使用提供的业务接口从视图模型进行调用以访问模型信息?这样,模型本身就会隐藏在UI之外。与选项1的图像类似,只是会有一些接口访问模型和服务。
3)或者UI确实有模型。但我可以看到许多场合,业务层需要这些信息,导致多个模型看起来相对完全相同。想象一下,下面的整个图片都位于用户界面中。然后在模型下方有一个业务层,模型访问该层。 http://rarcher.azurewebsites.net/Images/mvvm00.png
答案 0 :(得分:2)
查看永远不能直接访问模型。 View通过其DataContext连接到ViewModel。
ViewModel 可以直接访问模型,并且能够从模型中恢复值并将值设置到模型中以及调用方法以便执行操作。但ViewModel无法直接访问View,可能有0,1个或多个View实例都在查看同一个ViewModel,而且它永远不会知道。
模型不知道ViewModel或View的存在。因此,您可以在不同的项目中重用Model类,而不依赖于WPF甚至是用户界面。
如何将模型附加到ViewModel取决于您。您可以将对Model的引用传递给ViewModel的构造函数。或者提供在构造ViewModel之后调用的单独方法或属性。
对于完全分离,您将在ViewModel上公开与Model本身(或实际需要的子集)相同的属性列表。 ViewModel可以挂钩到应该从Model公开的INotifyPropertyChanged接口的PropertyChanged事件。当它看到更改时,它可以通过自己的属性和自己的INotifyPropertyChanged接口实现将更改传递到任何观看的视图。
答案 1 :(得分:0)
正如@Phil Wright在回答中所述,模型应该不了解ViewModel或View,因此您可以在不同层之间重复使用模型。根据我的经验,模型通常是简单的POCO,不依赖于其他层。
您是否在图层之间重复使用模型取决于您。如果您使用的是ORM,例如Entity Framework,那么您的模型可能是您的实体类。您的业务层可能决定使用这些实体类,或者您可能希望对它们进行抽象或聚合它们或对它们执行其他操作。 在一天结束时,您的模型中的内容会受到您希望存储在其中的内容以及您希望如何使用它们的驱动,并且SO无法提供相关指导,因为问题是如此开放的
就WPF和MVVM而言,我喜欢将ViewModel视为一个或多个模型的聚合器。您通常以某种方式(通过其构造函数或其他)将模型传递给ViewModel:ViewModel然后提供View(通过绑定)使用的属性和命令,以便读取和/或更改ViewModel的状态。稍后,ViewModel可能需要更改其提供的模型的状态,以反映View发起的更改。
您可能会发现业务层所需的模型与ViewModel使用的模型略有不同,不幸的是,当发生这种情况时,您最终可能会编写许多非常相似的模型代码。在这种情况下,Model接口可能有所帮助:没有什么可以说ViewModel使用的模型必须是具体的类。因此,您可以拥有一个“复杂”模型,它具有ViewModel和业务层所需的所有属性,然后通过两个不同的接口(每个层一个)公开该模型,以便与特定层无关的属性为它是不可见的(如果这是有道理的!)。