Estamos entrando en MVVM en WPF.¿Debería MVVM ViewModel realizar una conversión/validación de tipo?
Hemos implementado nuestros ViewModels con propiedades 'fuertemente tipadas' (int, double? Etc.) a las que nos vinculamos en la vista.
La conversión de tipos funciona bien, principalmente, por lo que ingresar datos es bastante simple. Pero nos encontramos con problemas con la validación.
Si, por ejemplo, se ingresa un valor no numérico en un cuadro de texto vinculado a una propiedad numérica, la conversión falla, la propiedad nunca se establece, y nunca tenemos la oportunidad de proporcionar una opinión adecuada al usuario. Peor aún, la propiedad conserva su valor actual, lo que provoca una discrepancia entre lo que se muestra en la vista y lo que realmente está en ViewModel.
Todo esto se puede manejar con convertidores de valor, lo sé. Pero he visto varias opiniones en el sentido de que la conversión no debe ser la responsabilidad de la vista en absoluto. Lo que se ingresa en la vista son cadenas, y la conversión, validación, etc. debe ser la responsabilidad de ViewModel (según el argumento).
En caso afirmativo, deberíamos reescribir la mayoría de las propiedades de nuestros ViewModels en cadena, y proporcionar información de error a través de la interfaz IErrorInfo, por ejemplo. Seguramente sería más simple, más delgado XAML en la vista. Por otro lado, la conversión, la validación, etc. serán menos declarativas, explícitas y flexibles, desde el punto de vista del diseñador de vistas.
Nos parece que estos dos enfoques son fundamentalmente diferentes, por lo que antes de decidirnos, nos gustaría algunas opiniones SO informadas sobre el asunto.
Entonces, ¿deberían los ViewModels exponer una interfaz simplificada, 'basada en texto' a la vista y manejar la conversión internamente? ¿O deberían las propiedades de ViewModel exponer los tipos de datos reales, dejando esos quehaceres a la vista para manejarlos?
Actualización:
difícil elegir un ganador aquí, pero finalmente aterrizó en uno de ustedes que concluye más o menos como yo.
Específicamente, hemos decidido mantener las propiedades de ViewModel escritas. La razón principal de esto es la flexibilidad que nos brinda en el diseño de la vista y el poder de la conversión/formato declarativo explícito en XAML.
Me di cuenta de una suposición con usted que no estará de acuerdo con nosotros en esto, que el diseño de la vista es fijo y listo. Por lo tanto, no es necesario tomar decisiones sobre la conversión, el formato, etc. en la vista. Pero el nuestro es un proceso ágil, y no tenemos todos los detalles esenciales de la UI descubiertos de antemano.
De hecho, dejar los detalles de la interfaz de usuario elaborados en el camino deja espacio para la creatividad y, además, en mi opinión, incluso un diseño meticulosamente trabajado siempre terminará cambiando a lo largo del proceso de implementación.
El objetivo de todo esto es que, mientras que la aplicación de reglas de negocio ciertamente pertenece al ViewModel, nos parece que la simple conversión y el formateo es una cosa vista. Puede sonar como una herejía, pero en realidad no creo que la conversión de tipos en la vista requiera pruebas unitarias (siempre que compruebemos los convertidores de tipo reales).
En general, una gran discusión, amigos, con opiniones bien formuladas e informadas. Gracias.
Estaba a punto de publicar esta pregunta. +1 – Gishu