24 votos

En MVVM, es cada ViewModel junto a un solo Modelo?

En un MVVM aplicación, es cada ViewModel junto a uno solo, Model?

Estoy tratando de implementar el patrón MVVM en un proyecto, pero he encontrado que a veces, View puede necesitar información de múltiples Models.

Por ejemplo, para un UserProfileView, su UserProfileViewModel puede necesitar información sobre UserAccountModel, UserProfileSettingsModel, UserPostsDataModel, etc.

Sin embargo, en la mayoría de los artículos que he leído sobre MVVM, el ViewModel sólo consiste en un Modelo a través de la Inyección de Dependencia. Por lo que el constructor toma en sólo un Modelo.

¿Cómo sería la ViewModel de trabajo cuando se ha de obtener información de múltiples Models? O tal situación nunca se producen en MVVM?

PS: no estoy utilizando el Prisma o la Unidad de Marco. Estoy tratando de implementar patrones similares en un proyecto que estoy trabajando, que no utiliza Prisma o de la Unidad. Es por eso que necesito entender exactamente cómo algunas de estas cosas.

19voto

Alex J Puntos 4142

En mi comprensión del patrón MVVM, el único requisito práctico es que la Vista obtiene sus datos a partir de las propiedades de un ViewModel (probablemente a través de un mecanismo de enlace). El ViewModel es una clase que elabora específicamente para ese punto de vista, y asume la responsabilidad de llenar a sí misma como necesaria. Usted podría pensar en él como ActiveRecord para la vista.

Como tal, no importa lo que hagas dentro de la ViewModel para obtener los datos que sus propiedades se deben mostrar. Usted puede obtener consultando a algunos de los servicios, la lectura de uno o más negocios de la entidad de los modelos, se genera en el lugar, o todas las anteriores. Es perfectamente normal que se necesite una combinación de todas estas cosas para hacer que una vista funcional.

Como en cualquier modelo de presentación, el punto es sólo para separar el proceso de mostrar algunos datos en la pantalla, desde el proceso de obtención de los datos. De esa manera usted puede probar cada parte del proceso por separado.

Edit: he Aquí una pequeña pero esperemos ejemplo completo del flujo de las dependencias.

// 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
  }
}

10voto

jgauffin Puntos 51913

Se pueden utilizar varios modelos en un modelo de vista. El propósito de la vista de modelo es abstracto fuera del negocio / capa de datos (es decir, el modelo).

Sin embargo, el uso de más de un modelo generalmente indica que la vista es demasiado grande. Usted puede ser que desee dividir en los controles de usuario (que tienen su propio punto de vista de los modelos).

3voto

blindmeis Puntos 10881

un viewmodel contiene el "punto de vista de la lógica" - así que todo lo que quiero mostrar en la vista es expuesto a través de la viewmodel. si quieres mostrar los datos de diffenrent "modelos", su viewmodel agregate este y la vista puede enlazar.

el propósito principal de mvvm fue por cierto la prueba de unidad. esto significa facilidad de las pruebas de vista de la lógica, sin interfaz de usuario.

EDIT: ¿por qué crees:

ViewModel sólo tiene un único parámetro para la Vista en su constructor

EDIT2:

hay btw dos enfoques principales para trabajar con mvvm, el primero es "Primero la Vista" segundo "Viewmodel" Primer supuesto, usted puede mezclar ambos y elegir el mejor método para usted necesita.

2voto

Akku Puntos 2141

Me gustaría asegurarse de que usted entiende la diferencia entre ver, perspective, y todas las demás clases del modelo. El ViewModel es el modelo de objeto que se llena con los datos que la vista puede ser enlazado. Existe para proporcionar datos a la vista, lo que hace que el ViewModel objeto de la unidad comprobable, y toda la lógica de negocio independiente desde el punto de vista. Así, usted puede desarrollar su lógica de negocios totalmente sin usar la vista de sí mismo, y puede sustituir a la vista con solo la construcción o el uso de otro punto de vista y la unión a la ViewModel propiedades del objeto. Si una vista completa de los campos de texto vacíos por ejemplo, el contenido de los campos de texto se pueden enlazar a las diferentes propiedades de la vista de modelo.

Hay por lo general sólo debe ser un modelo de vista. PERO si es demasiado complejo, puede utilizar subpropiedades de la envolvente de los objetos, como se describe en la Unión a ViewModel.Subclase.Propiedad (sub-propiedad)

La Perspective puede obtener los datos que devuelve a la vista de un montón de diferentes fuentes, objetos de negocio, bases de datos, lo que sea.

1voto

PVitt Puntos 5652

Por lo general hay un ViewModel por Modelo. Estos ViewModels contienen la lógica para manejar los datos del modelo. Por otro lado, a cada vista tiene su propio modelo de vista, demasiado. Así que esto significa:

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();
    }
}

Estos son los ViewModels que encapsulan los modelos. Las opiniones tienen su propio ViewModels:

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

Para responder a su pregunta, ViewModel1 se refiere a ViewModelA y ViewModelB. Por lo tanto, puede obtener los datos de ViewModel1.ViewModelA.TestValue.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X