none
Consulta sobre Validación mediante INotifyDataErrorInfo RRS feed

  • Pregunta

  • Hola a todos, estoy validando mediante INotifyDataErrorInfo y el sistema de validación funciona bien creas una clase que implemente la interfaz y le añades métodos de validación mediante expresiones regulares o a pelo, pero detecto el mismo problema con MVVM que con WinForms y es que la validación directa de la caja de texto a través del SET de la propiedad del Viemodel solo se dispara si la caja recibe el foco o se entra en ella, pero si se pulsa el botón de guardar sin pasar por ella no se valida.

    Es por ello que veo que se necesita hacer una validación global y completa en algún otro sitio, y creo ver que el método CanExecute del comando es el sitio indicado para ello, me lo podéis confirmar si se debe validar en ese método o ello puede dar algún problema, por ejemplo estoy detectando que al dar un fallo en una propiedad se iluminan con un marco rojo no la que acabo de escribir sino todas las  todas las controladas, por eso pienso que a lo mejor no es el sitio para ello.

    un saludo

    martes, 25 de agosto de 2015 23:11

Respuestas

  • finalmente no hago la validación en el método CanExecute del comando porque me disparaba de golpe todos los errores, por lo que he optado por dejar en el CanExecute el aviso de los errores, luego para cada propiedad en el SET después de asignar el valor llamo al método de validación, creo una clase que implementa la interfaz y ahí meto todos los métodos de validación, y finalmente en el EXECUTE del comando compruebo todas las reglas de validación antes de Ejecutar.

    un saludo

    • Marcado como respuesta fjjcent miércoles, 26 de agosto de 2015 9:47
    miércoles, 26 de agosto de 2015 9:47

Todas las respuestas

  • este es el código que tengo en CanExecute del comando de guardar

     public bool CanExecute(object parameter)    {
                if (parameter != null)
                {
                    AlbergadoViewModel p = (AlbergadoViewModel)parameter;
                    p.CampoObligatorio("desnombre", p.desnombre);
                    p.CampoObligatorio("desapellido1", p.desapellido1);
                    if (ALBVM.HasErrors)
                    {
                        List<string> datos = new List<string>();
                        foreach (List<string> err in ALBVM.GetErrors(string.Empty).AsQueryable())
                        {
                            if (!ALBVM.LosErrores.Contains(err[0])) ALBVM.LosErrores.Add(err[0]);
                        }

                        StringBuilder SB = new StringBuilder();
                        foreach (string error in ALBVM.LosErrores)
                        {
                            SB.Append(error + "\n");
                        }
                        if (SB.Length > 0) GestorServicios.mensajeAviso(SB.ToString(), "Errores detectados");
                        return false;
                    }
                }
                ALBVM.ClearErrors(String.Empty);
                return true;
            }

    marco que parameter no esté nulo porque el programa pasa por el comando cada rato, un montos de veces y para evitar que intente validar desde el principio

    martes, 25 de agosto de 2015 23:32
  • finalmente no hago la validación en el método CanExecute del comando porque me disparaba de golpe todos los errores, por lo que he optado por dejar en el CanExecute el aviso de los errores, luego para cada propiedad en el SET después de asignar el valor llamo al método de validación, creo una clase que implementa la interfaz y ahí meto todos los métodos de validación, y finalmente en el EXECUTE del comando compruebo todas las reglas de validación antes de Ejecutar.

    un saludo

    • Marcado como respuesta fjjcent miércoles, 26 de agosto de 2015 9:47
    miércoles, 26 de agosto de 2015 9:47