MVVM:Si una VM objeto exponer una M objeto directamente, o sólo a través de los captadores delegar a M captadores?

StackOverflow https://stackoverflow.com/questions/1114555

Pregunta

la mejor manera de explicar es con el ejemplo así:

este es el modelo

public class Person 
{
    public int age;
    public string name;
}

este es el modelo de vista

public class PersonVM
{    
}

mi pregunta es:
si el vm exponer a la persona a la plantilla de datos o encapsular las propiedades del modelo con sus propiedades?

¿Fue útil?

Solución

El modelo de vista debe declarar sus propias propiedades y ocultar los detalles específicos del modelo de la vista. Esto le da la mayor flexibilidad y ayuda a mantener las cuestiones vista de tipo de modelo se filtre en las clases del modelo. Por lo general, su punto de vista las clases del modelo encapsulan el modelo por delegación. Por ejemplo,

class PersonModel {
    public string Name { get; set; }
}

class PersonViewModel {
    private PersonModel Person { get; set;}
    public string Name { get { return this.Person.Name; } }
    public bool IsSelected { get; set; } // example of state exposed by view model

    public PersonViewModel(PersonModel person) {
        this.Person = person;
    }
}

Recuerde: el modelo no debe saber nada sobre el modelo de vista que está consumiendo, y el modelo de vista no debe saber nada acerca de la opinión de que está consumiendo la misma. La vista debe saber nada acerca de los modelos que están al acecho en el fondo. Por lo tanto, encapsular el modelo detrás de propiedades en el modelo de vista.

Otros consejos

No hay un acuerdo general sobre la cuestión.Por ejemplo, fue una de las preguntas abiertas acerca de MVVM formulado por el Barrio de la Campana aquí:

Es el VM permitido ofrecer a la V sin envolver M-objeto (por ejemplo, la materia prima Empleado) ?O la M-objeto del propiedades (si es que se permite tienen propiedades!) estar expuesto exclusivamente a través de la superficie de un VM contenedor?

Las principales ventajas de no exponer directamente el Modelo de la máquina virtual son:

Los contras son:

  • usted tendrá que duplicar una gran cantidad de código para exponer todos los modelos de propiedades en el viewmodel.

  • si se unen el punto de vista de control para el viewmodel de la propiedad, usted podrá enviar el propertyChanged eventos desde el viewmodel.Pero, ¿qué sucede si los modelos de cambio de propiedad de otra fuente diferente de la viewmodel setter?A continuación, tiene que notificar a la perspective, con el fin de con 2 OnPropertyChanged, uno en el modelo y en el viewmodel...bastante complejo!

Así que para mí la respuesta correcta es:depende de sus necesidades.

Una solución interesante a este fue propuesto por Robert McCarter en volumen MSDN 25.

http://msdn.microsoft.com/en-us/magazine/ ff798279.aspx

Se utiliza un punto de vista dinámico Modelo para proporcionar una capa en la parte superior del modelo, evitando hacer proxy a todas las propiedades del modelo.

Si su problema de espacio no requiere de altas prestaciones (dinámicas hacen incurrir en un golpe de rendimiento), esta es una excelente solución. La vista no necesita saber nada sobre el modelo, pero la vista del modelo no tiene que propiedades de proxy que se proporcionan "tal cual". En cualquier momento se pueden añadir propiedades a la vista del modelo para envolver las propiedades modelo sin modificar la vista o el modelo. Lea el artículo para más detalles.

Tener un modelo de vista para cualquier modelo podría ser peor que eso. ¿Qué pasa si usted tiene una estructura jerárquica de un modelo, o incluso una simple colección? En ese caso, tendrá que recorrer todos los modelos y construir una instancia de modelo de vista per-modelo, y también para registrar eventos notificar el cambio u otros eventos. En mi humilde opinión, esto es completamente loco, y poco razonable. Como dijo danice, que va a terminar con la porción de código y un gran dolor de cabeza.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top