Silverlight 3 – DataGrid - Validaciones

Sigo mostrando que novedades trae el DataGrid en Silverlight 3. Ahora voy a mostrar de que manera podemos validar la .

Vamos a tomar la misma clase y XAML que usamos en el ejemplo del agrupamiento, lo que vamos a realizar son algunas modificaciones a la clase agregándole la funcionalidad de validar los datos.

Tenemos dos tipos de validaciones disponibles, a nivel de Celda o a nivel de Fila.

Primero agregamos la referencia a System.ComponentModel.DataAnnotations.

Validación de Celda

Tenemos dos posibilidades de generar esta validación, una es utilizando ValidationException y la otra es usando ValidationAttributes llamando a ValidateProperty.

Estas dos opciones las realizamos en la propiedad en el setter (cuando asignamos valor).

Para utilizar ValidationException tenemos que definir las reglas en la propiedad y en el caso de que el valor no sea válido, generamos una excepción al invocar a ValidationException, la cual el control DataGrid lo muestra como una validación de Celda.

private int anio;
public int Anio
{
    get { return anio; }
    set
    {
        if (value != anio)
        {
            if (value < 1950 || value > 2009)
            {
                throw new 
                    ValidationException("Año debe ser estar entre 1950 y 2009");
            }
            anio = value;
        }
    }
}

 

Como vemos al cargar un valor inválido nos muestra el error al lado de la celda modificada.1

Ahora podemos utilizar ValidationAttributes en el caso de que queramos utilizar las reglas decorativas que tiene la propiedad.

private string nombre;
[Required(ErrorMessage = "El nombre no puede ser vacío")]        
public string Nombre
{
    get { return nombre; }
    set
    {
        if (value != nombre)
        {
            Validator.ValidateProperty(value, new ValidationContext(this, null, null) { MemberName = "Nombre" });
            nombre = value;
        }
    }
}

En este caso, lo que decimos es que verifique que el nombre cumpla con las reglas impuestas, en este caso Required (también funciona para Range y RegularExpression). De esta manera toma esta validación como parte de la Celda.2

Validación de Fila

Las reglas decorativas, como ser Required, Range y RegularExpression son validaciones de Fila, salvo que las utilicemos con ValidationAttributes.

[Required]
public string Banda { get; set; }

 

Además tenemos otra posibilidad que es generar reglas que se ejecutan al finalizar la edición de la fila, donde con toda la información cargada vamos a poder validarla.

[CustomValidation(typeof(DiscoValidator), "IsValidGenero")]
public class Disco

 

Declaramos que la clase Disco va a utilizar la validación IsValidGenero de la clase DiscoValidator.

Creamos la clase DiscoValidator.

public static class DiscoValidator
    {
        public static bool IsValidGenero(object discoObject, 
                                         ValidationContext context, 
                                         out ValidationResult validationResult)
        {
            validationResult = null;
            Disco disco = discoObject as Disco;
 
            if (disco.Genero != Generos.Heavy)
            {
                List<string> properties = 
                    new List<string>() { "Genero" };
 
                validationResult = 
                    new ValidationResult("Sólo puede cargar del genero Heavy", 
                                         properties);
            }
 
            return (disco.Genero == Generos.Heavy);
        }                
    }

Validamos que el Genero cargado sea solamente el que especificamos.3

Como vemos, en la parte inferior aparecen las validaciones correspondientes.

Pueden descargar el proyecto aquí.

No Comments