2012-06-29 39 views
6

Parece que hay una orientación que un modelo no debe exponer a sus entidades para ver, y que todas las propiedades requeridas debe ser duplicado en el modelo de vistaMVVM duplicar, Características del modelo en modelo de vista

Ejemplo:

Product 
Id {get; set;} 
Name {get; set;} 
....... 


ProductViewModel : ViewModelBase 
Id {get; set;} 
Name {get; set;} 
....... 

¿Por qué es esto requerido? Puedo entender esto si el Modelo no implementa INPC, pero si lo hace, entonces me parece bastante innecesario.

Respuesta

7

cuando la vista se une a la del modelo:

  • Si la vista tiene que cambiar o tiene varios puntos de vista un cambio en el modelo provocará cambios en todas las Vistas enlazada a ese modelo.

  • Desde la perspectiva de la Vista, el objeto al que está ligado puede no ser tan intuitivo; cuando necesita agregar propiedades y/o comandos al objeto, ¿los agrega al ViewModel y conserva las propiedades "originales" en el Modelo o modifica el Modelo?

Tener un modelo de vista le da una abstracción adicional entre un modelo único y múltiple (versiones de) Vistas

Con todo, es sólo una guía, pero ser conscientes de que lo que parece bien hoy podría no ser tan genial cuando necesitas modificar/actualizar la aplicación.

+0

Hola, desde mi punto de vista, el modelo es POCO con INPC – Goran

+0

Lo siento, estoy teniendo dificultades para escribir desde mi teléfono, voy a responder cuando regrese a casa – Goran

+0

Considero que el modelo es todo lo que proporciona una fuente externa (clases proxy, repositorio, transmisión) INPC solo es necesario cuando deseo que la Vista se actualice mediante cambios en lo que está vinculado a ella. Nunca ligé el Modelo a la Vista por razones en mi respuesta, para eso es el Modelo de Vista. –

3

Orientación, es solo eso. Depende de la situación en cuestión. Los puristas argumentarán que separar el modelo por completo de la vista permite que el modelo cambie sin que la vista cambie.

tiendo a sólo Características del modelo proxy si tengo que (ya sea INPC o algún lógica específica vista como el modelo tiene nombre y apellido, pero no NombreCompleto)

De lo contrario, se unen al modelo (que es una propiedad pública en ViewModel). Si mi situación cambia y necesito encapsular algo, me refactorio cuando lo necesite.

Siempre trato de asegurar que haya un ViewModel en su lugar (incluso si solo expone el modelo), por lo que la refactorización es más fácil más adelante.

+0

Hola Adam, lo siento por la respuesta tardía, estaba de vacaciones.Entonces, ¿cómo manejaría la situación en la que necesita mostrar una colección de Clientes en la Vista de Factura, donde solo se requiere una información muy básica (por ejemplo, Código, Nombre e Id.). ¿Tendría un CustomerBasicInfo en su modelo, o ...? – Goran

+0

Normalmente, el modelo lo dicta su dominio, un servicio web, etc. Por lo tanto, crea un modelo de vista para ajustar el modelo y facilitar la visualización de los datos (por ejemplo, agregar propiedades como seleccionadas, visibles, etc.). Si tiene una vista de solo lectura y su modelo es lo suficientemente similar a la estructura de vistas, entonces siempre puede usarlo ahora y reemplazarlo más tarde con un modelo de vista a medida que cambian sus especificaciones. Tenga cuidado de no dejar que las preocupaciones de UI entren en su modelo –

1

Mi pregunta es, ¿por qué sus modelos implementan INPC? ¿Lo necesitan?

Por lo general, los modelos son solo un DTO y no necesitan ninguna lógica de cambio.

Además, si su implementación básica de INPC proviene de un marco MVVM, pero sus modelos existen en un ensamblaje compartido, ¿ese ensamblaje necesita una referencia a su marco MVVM y potencialmente otros ensamblajes WPF también?

El escenario que teníamos era un conjunto de objetos compartidos que representaban nuestros datos tanto en el servidor como en el lado del cliente. El lado del cliente era una aplicación WPF, por lo que estaba bien, pero para el lado del servidor era un servicio, por lo que no necesitábamos INPC.

+0

Hola, Cameron, perdón por la respuesta tardía, estaba de vacaciones. Bueno, alguien debe implementar INPC, ya sea Cliente (Modelo) o ClienteModelo. ¿Necesitamos DTO en cada escenario? Si desea introducir una referencia al marco MVVM de Model, puede, pero no es obligatorio. La implementación de INPC es muy simple. ViewModelBase del marco MVVM se seguirá utilizando como base para VIewModels. Mi problema es el siguiente: si hago una pregunta "¿debería duplicar todas las propiedades del modelo en la máquina virtual?", Y la respuesta es sí, independientemente del tipo de aplicación, me pregunto: ¿por qué? – Goran

0

Su ViewModel es incorrecto. Si ya tiene un Modelo de tipo de producto, simplemente puede definir algo como esto en su ViewModel: public Product Product {...}

+2

¡Ese es el núcleo de su pregunta! La exposición del modelo a la vista evita la responsabilidad de ViewModel. –

Cuestiones relacionadas