2009-03-13 9 views
6

Tengo un cuadro de texto en una aplicación WPF vinculada a una propiedad en una clase Linq to Entities que implementa IDataErrorInfo. El enlace de texto tiene ValidatesOnExceptions = True y ValidatesOnDataErrors = True. Cuando el cuadro de texto está vinculado a una propiedad entera y el usuario ingresa texto, el contorno del cuadro de texto aparece en rojo ya que no configuré un estilo personalizado.WPF Enlace: cómo determinar el objeto no es válido para evitar Guardar

En mi método Guardar, ¿cómo sé que el objeto no se puede guardar porque no es válido? Prefiero que el usuario haga clic en el botón Guardar y puedo notificarle de un problema en lugar de deshabilitar el botón Guardar.

Saludos,

de Dave

Respuesta

5

no he encontrado una manera fácil de hacerlo. Encontré un código alrededor de las trampas para volver a recurrir a través de todos los controles en el formulario y determinar si alguno de ellos tiene errores de validación. Terminé convirtiéndolo en un método de extensión:

// Validate all dependency objects in a window 
internal static IList<ValidationError> GetErrors(this DependencyObject node) 
{ 
    // Check if dependency object was passed 
    if (node != null) 
    { 
     // Check if dependency object is valid. 
     // NOTE: Validation.GetHasError works for controls that have validation rules attached 
     bool isValid = !Validation.GetHasError(node); 
     if (!isValid) 
     { 
      // If the dependency object is invalid, and it can receive the focus, 
      // set the focus 
      if (node is IInputElement) Keyboard.Focus((IInputElement)node); 
      return Validation.GetErrors(node); 
     } 
    } 

    // If this dependency object is valid, check all child dependency objects 
    foreach (object subnode in LogicalTreeHelper.GetChildren(node)) 
    { 
     if (subnode is DependencyObject) 
     { 
      // If a child dependency object is invalid, return false immediately, 
      // otherwise keep checking 
      var errors = GetErrors((DependencyObject)subnode); 
      if (errors.Count > 0) return errors; 
     } 
    } 

    // All dependency objects are valid 
    return new ValidationError[0]; 
} 

Entonces, cuando el usuario hace clic en el botón Guardar en un formulario, hago esto:

var errors = this.GetErrors(); 
if (errors.Count > 0) 
{ 
    MessageBox.Show(errors[0].ErrorContent.ToString()); 
    return; 
} 

Es mucho más trabajo de lo que debería ser , pero usar el método de extensión lo simplifica un poco.

+0

Esta es una buena solución. Gracias. – Jirapong

3

También podemos establecer NotifyOnValidationError a true en sus Binding s, a continuación, agregar un controlador para el evento Error en algún elemento padre. El evento se activará cada vez que se agregue o elimine un error.

+0

idea genial! ¡Publicaré mi solución una vez que la aplique a mi código! –

Cuestiones relacionadas