2009-12-22 11 views
8

Supongamos que tengo una clase llamada Customer. Ahora necesito presentar al cliente a la vista. Así que creé CustomerViewModel para usar en encuadernación. Estoy buscando la mejor manera de crear la clase CustomerViewModel. A continuación están mis pensamientos sobre crearlo.La mejor manera de crear un ViewModel en MVVM

1 - Cree nuevamente todas las propiedades en el cliente en el modelo de vista. Inyecte la instancia del cliente en el modelo de vista y cada propiedad recuperará el valor de este objeto del cliente. La ventaja de este método es que puedo crear una clase base común para todos los modelos de vista y tener una funcionalidad común descargada allí. La desventaja será el tiempo requerido para crear todas las propiedades nuevamente en el modelo de vista y realizar el mantenimiento.

2 - Derive el modelo de vista del cliente. Así que tengo todas las ventajas del cliente en el modelo de vista. Pero esto no me permitirá usar una clase base común y poner allí una lógica de modelo de vista común.

Así que me pregunto cuál será el mejor método para crear un modelo de vista? ¿Hay algún método alternativo que sea mejor de lo que pensaba?

+0

¿Cuánto tiempo demora para que repita las propiedades del modelo en el modelo de vista? Ser capaz de poner un convertidor o desencadenar con fines de visualización hace que valga la pena los minutos extra para mí. Si tiene una vista compleja con muchos controles, agregue el modelo como una propiedad en el modelo de vista y ligue a Model.Property en la vista. – adrianm

+2

Me mantendría alejado del n. ° 2. No creo que siempre encuentres una asignación clara entre una clase de modelo específica y un modelo de vista.Para la mantenibilidad me gustaría ir con alguna otra clase que lógicamente podría sentarse frente al modelo personalizado, pero también podría exponer a la vista otros tipos de modelos en el futuro. –

Respuesta

5

Debería considerar leer Josh Smith's article en MVVM.

También tiene un marco llamado MVVM Foundation que tiene una clase base ViewModel. En general, creo que la forma en que implementa ViewModel es la mejor en general.

+0

Ya lo he visto. Él está haciendo el método que describí en el punto 1. –

+0

Sí ... creo que ese es el mejor método. He trabajado en un proyecto con más de 100 ViewModels y este fue el mejor método y el más fácil de mantener en general. Espero que ayude –

0

Si su clase de cliente original no es compatible con el enlace de datos, se verá obligado a crear una clase de modelo de vista y replicar las propiedades de la clase del cliente.

Sin embargo, si su clase Cliente ya implementa soporte para enlace de datos (tiene propiedades de dependencia O implementa INotifyPropertyChanged) entonces no hay ninguna razón fundamental por la que no pueda vincularse directamente con las propiedades de la clase Cliente.

Por supuesto, puede tener otras consideraciones: es posible que desee que su modelo de vista realice ciertas operaciones en respuesta a cambios en la propiedad o puede que no desee que los objetos del Cliente se modifiquen directamente. En cuyo caso, querrá ajustar la clase de Cliente.

Además, es posible que desee admitir la validación de datos a través de la interfaz IDataErrorInfo en cuyo caso si su clase de cliente no implementa esta interfaz probablemente también deba envolverla.

5

La opción 1 es mucho mejor. La razón es que desea poder variar estas dos capas de forma independiente. Tener un estrecho acoplamiento entre su modelo de dominio y su modelo de vista introducirá rigidez en su proceso de desarrollo que desea evitar.

La forma en que trato de tener que escribir tanto código es que no lo hago. Yo uso T4 templates, algunas convenciones razonables (propiedades, de forma predeterminada, aparecen en el modelo de vista; las clases de modelo de dominio implementan INotifyPropertyChanged y éstas se delegan hacia arriba) y un archivo de configuración para manejar la proyección/aplanamiento y generar los modelos de vista. También los genero como clases parciales para poder tratar de agregar otro código según lo necesiten.

Cuestiones relacionadas