2009-10-14 35 views
6

Bueno, creo que tengo una comprensión bastante buena de MVVM. Pero necesito algunas aclaraciones.MVVM, WPF y validación

¿El ViewModel es responsable de llamar al servicio apropiado para conservar la información del modelo?

Si es así, el ViewModel debe tener una forma limpia de determinar si los datos que contiene son válidos. Si los datos son válidos, actualizará el modelo en consecuencia. Finalmente, se invoca un servicio para persistir el modelo dado el modelo recientemente actualizado. Entonces la pregunta es: ¿Cómo validamos la información de ViewModel y la mostramos fácilmente en View?

He visto algunos enfoques diferentes para la validación. Uno sugiriendo usar IDataErrorInfo, que creo que es absolutamente repugnante.

Otro es agregar ValidationRule a Binding.ValidationRules. Sin embargo, utilizando este enfoque uno no puede operar en el contexto del modelo como un todo. El objeto ValidationRule solo puede realizar la validación en un solo valor. Un ejemplo podría ser garantizar que un valor sea un número entero o dentro de un cierto rango.

Otra idea que acabo de ver es utilizar BindingGroup. Pero no sé mucho sobre esto en este punto porque todavía estoy leyendo sobre ello.

Me gustaría poder realizar la lógica de validación en un solo lugar para ser utilizado por View y ViewModel. Además de este requisito, me gustaría poder realizar validaciones contra cualquier otro valor en ViewModel. Además, puede evitar que ViewModel persista datos si es un estado no válido. Esto debería reflejarse fácilmente en la Vista.

Si alguien me puede indicar algunos artículos o darme una idea de mi enfoque deseado, estaría muy agradecido.

+1

Fuera de interés, ¿por qué crees que IDataErrorInfo es desagradable? –

+2

Creo que es un mal uso del indexador para comenzar. ViewModel ["Nombre"] debería devolver un nombre ... no nulo/"¡error!". También está limitado a las propiedades que ha vinculado en la vista. No se presta muy bien a validadores como ValidateNameInformation, donde puede verificar todos los campos implicados. Si me malinterpretan en estas declaraciones, corríjanme. – Joe

+2

Una forma de evitar el abuso del indexador es utilizar una implementación de interfaz explícita. De esa manera, no tengo un "indexador" extraño en mi interfaz pública de ViewModel. Todavía estoy trabajando en cómo validar múltiples campos usando MVVM. –

Respuesta

2

que hacemos nuestra la validación de datos en nuestro modelo de negocio, y sólo permiten el ahorro cuando el modelo de negocio permite (porque tiene datos válidos), en retrospectiva, podríamos haber hecho esto en el modelo de vista sin embargo, esto significaría un enfoque de validación diferente para cada modelo de vista. y si muestra los mismos datos dos veces de diferentes maneras, puede que tenga que volver a escribir la lógica de validación.

Hacemos isdirty y isValid en casi todos los campos de la capa empresarial, escribimos nuestro propio objeto de campo personalizado y un objeto de referencia foráneo personalizado que implementa esto. luego, podemos vincular el staraight a estas propiedades para ver visualmente si somos válidos/sucios, etc. Luego, proponemos estas propiedades a través del modelo de vista.

+2

Tiene algunas bibliotecas para ayudarlo, p. Bloque de aplicación de validación (http://msdn.microsoft.com/en-us/library/cc309509.aspx) y CSLA (http://www.lhotka.net/cslanet/) – armannvg