En WPF, puede configurar la validación en función de los errores lanzados en su capa de datos durante el enlace de datos utilizando ExceptionValidationRule
o DataErrorValidationRule
.
Suponga que tiene un montón de controles configurados de esta manera y tiene un botón Guardar. Cuando el usuario hace clic en el botón Guardar, debe asegurarse de que no haya errores de validación antes de continuar con el guardado. Si hay errores de validación, querrás gritarles.
En WPF, ¿cómo puede saber si alguno de sus controles Data Bound tiene errores de validación configurados?
wpf
validation
data-binding
Kevin Berridge
fuente
fuente
IsValid
función? Veo que ha configurado unaCanExecute
que supongo que está relacionada con el comando del botón Guardar. ¿Funcionará esto si no estoy usando comandos? ¿Y cómo se relaciona el botón con los otros controles que deben verificarse? Mi único pensamiento sobre cómo usar esto es llamandoIsValid
a cada control que necesita ser validado. Editar: Parece que está validando elsender
que espero que sea el botón Guardar. Eso no me parece correcto.Window
también es un objeto de dependencia. Probablemente lo esté configurando con algún tipo de controlador de eventos en elWindow
. Alternativamente, puede llamarlo directamenteIsValid(this)
desde laWindow
clase.El siguiente código (del libro Programming WPF de Chris Sell e Ian Griffiths) valida todas las reglas de enlace en un objeto de dependencia y sus hijos:
Puede llamar a esto en su botón Guardar, haga clic en el controlador de eventos de esta manera en su página / ventana
fuente
El código publicado no me funcionó al usar un ListBox. Lo reescribí y ahora funciona:
fuente
Tuve el mismo problema y probé las soluciones proporcionadas. Una combinación de las soluciones de H-Man2 y skiba_k funcionó casi bien para mí, con una excepción: My Window tiene un TabControl. Y las reglas de validación solo se evalúan para el TabItem que está visible actualmente. Así que reemplacé VisualTreeHelper por LogicalTreeHelper. Ahora funciona.
fuente
Además de la gran implementación de LINQ de Dean, me divertí encajando el código en una extensión para DependencyObjects:
Esto lo hace extremadamente agradable considerando la reutilización.
fuente
Ofrecería una pequeña optimización.
Si hace esto muchas veces sobre los mismos controles, puede agregar el código anterior para mantener una lista de controles que realmente tienen reglas de validación. Luego, siempre que necesite verificar la validez, solo revise esos controles, en lugar de todo el árbol visual. Esto resultaría mucho mejor si tiene muchos de estos controles.
fuente
Aquí hay una biblioteca para la validación de formularios en WPF. Paquete Nuget aquí .
Muestra:
La idea es que definamos un alcance de validación a través de la propiedad adjunta que le indica qué controles de entrada rastrear. Entonces podemos hacer:
fuente
Puede iterar sobre todo su árbol de controles de forma recursiva y comprobar la propiedad adjunta Validation.HasErrorProperty, luego centrarse en la primera que encuentre en ella.
También puede utilizar muchas soluciones ya escritas. Puede consultar este hilo para ver un ejemplo y más información.
fuente
Puede que le interese la aplicación de muestra 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.
fuente
En forma de respuesta aogan, en lugar de iterar explícitamente a través de las reglas de validación, es mejor invocar
expression.UpdateSource():
fuente