在MVVM,每视图模型耦合到只有一个型号?(In MVVM, is every ViewModel

2019-07-02 17:02发布

在MVVM实现,每ViewModel耦合到只有一个Model

我想在项目中实现MVVM模式,但我发现,有时候,一个View可能需要从多个信息Models

例如,对于一个UserProfileView ,其UserProfileViewModel可能需要从信息UserAccountModelUserProfileSettingsModelUserPostsDataModel

然而,在大多数的文章我读MVVM,视图模型只包含在通过依赖注入一个模型。 因此,构造函数采用只有一个型号。

如何将在ViewModel工作时,它必须获得来自多个信息Models ? 或将这样的情况曾经发生在MVVM?

PS:我不使用棱镜或统一框架。 我想实现类似的模式进入,我上工作不使用棱镜或统一的项目。 这就是为什么我需要了解究竟是如何对这些事情的工作。

Answer 1:

在我的MVVM模式的理解,唯一的实际要求就是查看会从一个视图模型的性质及其所有数据(可能通过有约束力的机制)。 该视图模型是你对该视图专门制作一个类,并采取了按要求填充自身的责任。 你可以把它想的ActiveRecord的视图。

因此,它不会不管你的视图模型里面做什么,以获得其属性应该显示的数据。 你可以通过查询一些服务,阅读一个或多个业务实体模型,它产生在现场,或上述所有得到它。 这是完全正常需要的所有这些事情的组合来进行功能视图。

正如在任何呈现图案,该点仅仅是该过程分开显示在屏幕上的某些数据的,从获得该数据的过程。 这样,你可以单独测试过程的每个部分。

编辑:这是依赖的流动小,但希望完整的例子。

// Model/service layer

public class MyModelA
{
  public string GetSomeData()
  {
    return "Some Data";
  }
}

public class MyModelB
{
  public string GetOtherData()
  {
    return "Other Data";
  }
}

// Presentation layer

public class MyViewModel
{
  readonly MyModelA modelA;
  readonly MyModelB modelB;

  public MyViewModel(MyModelA modelA, MyModelB modelB)
  {
    this.modelA = modelA;
    this.modelB = modelB;
  }

  public string TextBox1Value { get; set; } 

  public string TextBox2Value { get; set; }

  public void Load()
  {
    // These need not necessarily be populated this way. 
    // You could load an entity and have your properties read data directly from it.
    this.TextBox1Value = modelA.GetSomeData();
    this.TextBox2Value = modelB.GetOtherData();
    // raise INotifyPropertyChanged events here
  }
}

public class MyView
{
  readonly MyViewModel vm;

  public MyView(MyViewModel vm)
  {
    this.vm = vm;
    // bind to vm here
  }
}

// Application layer

public class Program
{
  public void Run()
  {
    var mA = new MyModelA();
    var mB = new MyModelB();
    var vm = new MyViewModel(mA, mB);
    var view = new MyView(vm);
    vm.Load();
    // show view here
  }
}


Answer 2:

您可以在视图模型使用多个模型。 视图模型的目的是抽象掉业务/数据层(即模型)。

然而,使用多个模型通常表明的观点是太大。 你可能想将它拆分成用户控件(它们有自己的视图模型)。



Answer 3:

一个视图模型包含了“视图逻辑” - 这样的观点你想要显示是通过视图模型暴露出来。 如果从diffenrent你想要显示的数据“模型”,那么您的视图模型agregate这一点,并认为可以绑定到。

从MVVM主要目的是顺便说一句单元测试。 这意味着没有任何UI视图逻辑的简单的测试。

编辑:为什么你认为:

视图模型只有在其构造函数中查看一个参数

EDIT2:

顺便说一句有两种主要的方法与MVVM工作,首先是“检视首个”二是“视图模型首先”你当然可以混淆两者,并选择最好的方法适合你的需要。



Answer 4:

一个ViewModel可以在很多情况下不使用多个型号。 它本身是一个视图的“模型”。

考虑到用户输入自己的个人信息,包括地址的配置文件屏幕。 如果地址存储在“地址”表,其余的“个人资料”表格,然后视图模型同时使用的个人资料和地址模型来创建一个统一的视图模型。

作为jgauffin在他的回答中提到,很多时候你可以使用用户控件实现了一对一的关系,但你也可以通过尝试对时间这个100%的引入不必要的复杂性。



Answer 5:

我会确保你理解的视图,视图模型,以及所有其他模型类之间的差别。 视图模型是填充有该视图可以绑定到数据的模型对象。 它只是存在提供数据给视图,这使得视图模型对象单元可测试,整个业务逻辑从视图分开。 所以,你完全可以发展你的业务逻辑,而无需使用视图本身,而可以只用建筑或使用另外的看法,绑定到视图模型对象的属性替换视图。 如果视图是充满例如空文本字段,文本字段的内容可以被绑定到视图模型的不同的特性。

通常有真的应该只有一个视图模型。 但是,如果它太复杂了,你可以使用绑定对象的子属性就像在描述绑定到ViewModel.SubClass.Property(子属性)

该视图模型可以得到它返回到来自许多不同的来源,业务对象,数据库,无论视图中的数据。



Answer 6:

通常每次一个模型视图模型。 这些的ViewModels包含的逻辑来处理模型的数据。 在另一边的每个观点都有它自己的视图模型了。 因此,这意味着:

class ModelA 
{
    bool TestValue{get;set;}
}
class ViewModelA<ModelA>
{
    ValueViewModel<bool> TestValue{get; private set;}

    public ViewModelA(ModelA model) 
    {
        base.Model = model;
        this.Initialize();
    }
}

class ModelB 
{
    string Username;
}
class ViewModelB<ModelB>
{
    ValueViewModel<string> Username{get; private set;}

    public ViewModelB(ModelB model) 
    {
        base.Model = model;
        this.Initialize();
    }
}

这些是封装模型的ViewModels。 该观点有自己的ViewModels:

public ViewModelForExactlyOneView
{
    public ViewModelA{get;set;}
    public ViewModelB{get;set;}
}

要回答你的问题,ViewModel1指ViewModelA和ViewModelB。 该视图因此可以得到它的数据ViewModel1.ViewModelA.TestValue



Answer 7:

只使用用户模型视图

public partial class User : Login
{
    public string Password { get; set; }

    public List<Customer> customer { get; set; }
}

在此另一种模式登录继承和客户模式也是在这个模型中使用..



文章来源: In MVVM, is every ViewModel coupled to just one Model?