Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 对于MVVM,每个UI窗口是否都有自己的ViewModel?_Wpf_Design Patterns_Mvvm - Fatal编程技术网

Wpf 对于MVVM,每个UI窗口是否都有自己的ViewModel?

Wpf 对于MVVM,每个UI窗口是否都有自己的ViewModel?,wpf,design-patterns,mvvm,Wpf,Design Patterns,Mvvm,当我在MVVM模式下设计多个视图时,每个视图都有自己的ViewModel还是共享同一个视图?我知道这最终是一个灵活的决定,但最佳做法是什么 我的直觉告诉我每个视图(即每个单独的UI窗口)都有一个ViewModel。MVVM的所有博客示例都显示了一个视图,但仅此而已。是的,基本上您的视图模型应该只由一个视图使用。如果使用viewModel填充区域(如ASP.NET MVC中),则每次在不同位置显示视图时,都会“重用”该viewModel 这是Josh Smith对MVVM模式的讨论。然后,沃德·贝

当我在MVVM模式下设计多个视图时,每个视图都有自己的ViewModel还是共享同一个视图?我知道这最终是一个灵活的决定,但最佳做法是什么


我的直觉告诉我每个视图(即每个单独的UI窗口)都有一个ViewModel。MVVM的所有博客示例都显示了一个视图,但仅此而已。

是的,基本上您的视图模型应该只由一个视图使用。如果使用viewModel填充区域(如ASP.NET MVC中),则每次在不同位置显示视图时,都会“重用”该viewModel

这是Josh Smith对MVVM模式的讨论。然后,沃德·贝尔在这篇文章中讨论了他认为乔希遗漏了什么,同时坚持认为乔希的作品仍然非常出色

沃德出色地展示了这种模式的复杂性,并展示了存在的张力。以下是他对紧张局势的看法:

根据我的经验,视图和ViewModel设计之间存在一个“对话框”。虚拟机的存在是为了服务于一种观点,即使它努力独立于任何特定的具体观点。如果没有可以使用的视图,虚拟机是无用的;显然,虚拟机开发人员必须 请注意视图开发人员的提示

另一方面,在业务应用程序中,应用程序的必要性——视图必须做些什么来满足业务需求——是程序员的职责,并且通过ViewModel的功能得到了最好的表达

在视图和视图模型设计之间存在着必要的张力。作为一名开发人员,我忠于ViewModel(“应用程序应该做一些有价值的事情”),但以牺牲视图为代价来捍卫这种忠诚是愚蠢的(“良好的用户体验对于使应用程序易于学习和使用至关重要”)


是的,每个视图都应该有自己的视图模型

我不知道WPF到底是什么,但通常ViewModel在UI组件和业务逻辑组件之间进行调解。换句话说:它特定于视图/模型对-这是该组件存在的唯一原因


HTH.

对我来说,这是一个主观的陈述——教科书,我会说绝对是1-1配对——当然,积极主动并通过1-1设定范例没有什么错。但是,如果您有多个视图,每个视图代表同一数据的一个片段,那么您不必每个视图都有一个视图,您可以在多个视图中重复使用同一个视图,直到出现偏差为止。视图模型是ui和业务层之间的桥梁……如果业务功能相同,您要么将拥有一个通用的视图模型接口或基础并向下转换,要么将多次复制相同的逻辑。如果视图是唯一改变的东西,我认为在出现偏差之前重用相同的视图模型没有问题

在wpf中,您应该绑定到模型上的值,因此除非您的视图模型引用了不应该成为问题的具体视图。即使这样,您也可以将其抽象为视图约定(接口),并将属性改为该类型