WPF Data Binding y Validation Rules Mejores prácticas

Tengo una aplicación WPF muy simple en la que estoy usando el enlace de datos para permitir la edición de algunos objetos CLR personalizados. Ahora quiero poner una validación de entrada cuando el usuario hace clic en guardar. Sin embargo, todos los libros de WPF que he leído realmente no dedican ningún espacio a este problema. Veo que puede crear reglas de validación personalizadas, pero me pregunto si esto sería excesivo para mis necesidades.

Así que mi pregunta es la siguiente: ¿hay alguna buena aplicación de muestra o artículo en alguna parte que demuestre las mejores prácticas para validar la entrada del usuario en WPF?

Creo que la nueva forma preferida podría ser usar IDataErrorInfo

Lea más aquí

De la documentación de MS Patterns & Practices :

Validación de datos e informes de errores

A menudo, se requerirá su modelo de vista o modelo para realizar la validación de datos y para señalar cualquier error de validación de datos a la vista para que el usuario pueda actuar para corregirlos.

Silverlight y WPF brindan soporte para administrar los errores de validación de datos que ocurren al cambiar las propiedades individuales que están vinculadas a los controles en la vista. Para las propiedades individuales que están unidas a un control de datos, el modelo o modelo de vista puede señalar un error de validación de datos dentro del conjunto de propiedades rechazando un valor incorrecto entrante y emitiendo una excepción. Si la propiedad ValidatesOnExceptions en el enlace de datos es verdadera, el motor de enlace de datos en WPF y Silverlight manejará la excepción y mostrará una señal visual al usuario de que hay un error de validación de datos.

Sin embargo, siempre que sea posible, se deben evitar excepciones con propiedades de esta manera. Un enfoque alternativo es implementar las interfaces IDataErrorInfo o INotifyDataErrorInfo en su modelo de vista o clases de modelo. Estas interfaces permiten que su modelo o modelo de vista realice la validación de datos para uno o más valores de propiedad y para devolver un mensaje de error a la vista, de modo que el usuario pueda ser notificado del error.

La documentación continúa explicando cómo implementar IDataErrorInfo e INotifyDataErrorInfo.

Personalmente, estoy usando excepciones para manejar la validación. requiere los siguientes pasos:

  1. en su expresión de enlace de datos, debe agregar “ValidatesOnException = True”
  2. en su objeto de datos al que se está vinculando, debe agregar el manejador DependencyPropertyChanged donde verifica si el nuevo valor cumple con sus condiciones; de lo contrario, restaura el valor anterior del objeto (si es necesario) y lanza una excepción.
  3. en su plantilla de control que utiliza para mostrar el valor no válido en el control, puede acceder a la colección de errores y mostrar un mensaje de excepción.

El truco aquí es vincular solo a los objetos que se derivan de DependencyObject. La implementación simple de INotifyPropertyChanged no funcionaría: hay un error en el marco, que le impide acceder a la colección de errores.

También mira este artículo . Supuestamente, Microsoft lanzó su Enterprise Library (v4.0) de sus patrones y prácticas donde cubren el tema de validación, pero Dios sabe por qué no incluyeron la validación de WPF, por lo que la publicación de blog que te estoy dirigiendo, explica lo que el autor hizo para adaptarlo. ¡Espero que esto ayude!

Es posible que le interese la aplicación de ejemplo BookLibrary del WPF Application Framework (WAF) . Muestra cómo usar la validación en WPF y cómo controlar el botón Guardar cuando existen errores de validación.

Si su clase de negocios es utilizada directamente por su UI, es preferible usar IDataErrorInfo porque acerca la lógica a su propietario.

Si su clase de negocio es una clase de código auxiliar creada por una referencia a un servicio WCF / XmlWeb, entonces no puede / no debe usar IDataErrorInfo ni lanzar Exception para usar con ExceptionValidationRule. En cambio, puedes:

  • Use ValidationRule personalizado.
  • Defina una clase parcial en su proyecto de interfaz de usuario de WPF e implemente IDataErrorInfo.