Model view controller 如果视图模型与其他页面相同,您会创建视图模型吗?

Model view controller 如果视图模型与其他页面相同,您会创建视图模型吗?,model-view-controller,design-patterns,mvvm,Model View Controller,Design Patterns,Mvvm,多亏了前面的回答,我现在已经编写了视图模型,并且非常喜欢这个概念,但是,在应用程序中,视图模型将与实际模型(术语上不确定…)完全相同 现在在这种情况下,我知道视图模型是最好的,因为有一天,我可能会更改应用程序逻辑,这会使应用程序更加健壮 然而,我现在遇到的一种情况是,我有一个多个页面,这些页面彼此非常紧密地链接,并且都需要完全相同的模型。在这种情况下,您是使用相同的视图模型,还是只为每个页面创建一个单独的相同视图模型?它们是否完全相同?在我看来,如果它们完全相同,那么应该重用ViewModel。

多亏了前面的回答,我现在已经编写了视图模型,并且非常喜欢这个概念,但是,在应用程序中,视图模型将与实际模型(术语上不确定…)完全相同

现在在这种情况下,我知道视图模型是最好的,因为有一天,我可能会更改应用程序逻辑,这会使应用程序更加健壮


然而,我现在遇到的一种情况是,我有一个多个页面,这些页面彼此非常紧密地链接,并且都需要完全相同的模型。在这种情况下,您是使用相同的视图模型,还是只为每个页面创建一个单独的相同视图模型?

它们是否完全相同?在我看来,如果它们完全相同,那么应该重用ViewModel。为什么要创建两次功能基本相同的ViewModels。但是,您应该注意ViewModel构造函数中没有服务调用,因为您可能不需要对所有视图都使用完全相同的服务调用。在这种情况下,即使您不需要,您的呼叫也会被浪费。在这种情况下,在ViewModel中创建一个公共方法,如下所示:

public void DoServiceCallsForViewA()
{
    ModelObj.FooA();    
}

public void DoServiceCallsForViewB()
{
    //your calls for view B 
    ModelObj.FooB();
}
然后在viewA中,您可以键入DataContext

((YourViewModelName)DataContext).DoServiceCallsForViewA();
在视图B中,您可以编写:

((YourViewModelName)DataContext).DoServiceCallsForViewB();

ViewModels应该是视图和控制器操作之间的简单数据载体(只是属性列表)。如果它们是你应用程序中的简单属性列表,你可以使用它们来让你对这个细节的最终决定变得不那么重要

…为了不回避这个问题,当视图要求完全相同的数据传输时,我会坚持使用一个ViewModel定义,并准备在其中一个视图需要稍微不同的内容时创建一个新的ViewModel


除了使视图:操作映射变得明显之外,没有必要复制,但权衡明显映射与违反DRY原则似乎是一个简单的决定…

在我看来,您的模型实例应该每个都有一个关联的ViewModel。也就是说,模型和视图模型之间应该有1:1的关系。但是,您可以自由地将多个视图绑定到同一个ViewModel

例如,您有一个Person对象和一个PersonViewModel,然后有两个与该Person相关的不同视图,例如PersonEdit视图和PersonDetailsView。您应该将PersonEditView和PersonDetailsView的所有必要属性都放入PersonViewModel中。然后使用
DataTemplateSelector
选择应在何时为ViewModel显示哪个视图

每个ViewModel实例都应该是单个模型实例的代表,并且应该是该模型实例的唯一代表