it-swarm-es.tech

Prácticas recomendadas de reglas de validación y enlace de datos de WPF

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

Entonces, mi pregunta es la siguiente: ¿existe una buena aplicación o artículo de muestra en algún lugar que demuestre las mejores prácticas para validar las opiniones de los usuarios en WPF?

100
Mark Heath

Creo que la nueva forma preferida sería usar IDataErrorInfo

Leer más aquí

83
rudigrobler

De la documentación de MS's Patterns & Practices :

Validación de datos y reporte de errores

Su modelo de vista o modelo a menudo se requerirá para realizar la validación de datos y 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 cuando se cambian las propiedades individuales que están vinculadas a los controles en la vista. Para las propiedades individuales que están vinculadas a un control de datos, el modelo de vista o el modelo pueden señalar un error de validación de datos dentro del establecedor de propiedades al rechazar un valor incorrecto entrante y lanzar 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 indicación visual al usuario de que hay un error de validación de datos.

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

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

23
Pat

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 el objeto de datos al que está enlazando, debe agregar el controlador DependencyPropertyChanged en el que verifica si el nuevo valor cumple sus condiciones; de lo contrario, restaura el valor antiguo del objeto (si es necesario) y lanza la excepción.
  3. en la plantilla de control que utiliza para mostrar un valor no válido en el control, puede acceder a la recopilació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 recopilación de errores.

10
Greg

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

3
murki

Es posible que le interese la aplicación de ejemplo BookLibrary de 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.

2
jbe

Si su clase de negocio es utilizada directamente por su interfaz de usuario, es preferible usar IDataErrorInfo porque pone la lógica más cerca de 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 Excepciones para usar con ExceptionValidationRule. En su lugar puedes:

  • Utilice la ValidationRule personalizada.
  • Defina una clase parcial en su proyecto de WPF UI e implementa IDataErrorInfo.
0
Alex Pollan