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 las referencias a System.ComponentModel.DataAnnotations y System.ComponentModel.
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.
|
1 |
<span style="color: #0000ff">private</span> <span style="color: #0000ff">int</span> anio; |
|
1 |
<span style="color: #0000ff">public</span> <span style="color: #0000ff">int</span> Anio |
|
1 |
{ |
|
1 |
get { <span style="color: #0000ff">return</span> anio; } |
|
1 |
set |
|
1 |
{ |
|
1 |
<span style="color: #0000ff">if</span> (<span style="color: #0000ff">value</span> != anio) |
|
1 |
{ |
|
1 |
<span style="color: #0000ff">if</span> (<span style="color: #0000ff">value</span> < 1950 || <span style="color: #0000ff">value</span> > 2009) |
|
1 |
{ |
|
1 |
<span style="color: #0000ff">throw</span> <span style="color: #0000ff">new</span> |
|
1 |
ValidationException(<span style="color: #006080">"Año debe ser estar entre 1950 y 2009"</span>); |
|
1 |
} |
|
1 |
anio = <span style="color: #0000ff">value</span>; |
|
1 |
} |
|
1 |
} |
|
1 |
} |
Como vemos al cargar un valor inválido nos muestra el error al lado de la celda modificada.
Ahora podemos utilizar ValidationAttributes en el caso de que queramos utilizar las reglas decorativas que tiene la propiedad.
|
1 |
<span style="color: #0000ff">private</span> <span style="color: #0000ff">string</span> nombre; |
|
1 |
[Required(ErrorMessage = <span style="color: #006080">"El nombre no puede ser vacÃo"</span>)] |
|
1 |
<span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Nombre |
|
1 |
{ |
|
1 |
get { <span style="color: #0000ff">return</span> nombre; } |
|
1 |
set |
|
1 |
{ |
|
1 |
<span style="color: #0000ff">if</span> (<span style="color: #0000ff">value</span> != nombre) |
|
1 |
{ |
|
1 |
Validator.ValidateProperty(<span style="color: #0000ff">value</span>, <span style="color: #0000ff">new</span> ValidationContext(<span style="color: #0000ff">this</span>, <span style="color: #0000ff">null</span>, <span style="color: #0000ff">null</span>) { MemberName = <span style="color: #006080">"Nombre"</span> }); |
|
1 |
nombre = <span style="color: #0000ff">value</span>; |
|
1 |
} |
|
1 |
} |
|
1 |
} |
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.
Validación de Fila
Las reglas decorativas, como ser Required, Range y RegularExpression son validaciones de Fila, salvo que las utilicemos con ValidationAttributes.
|
1 |
[Required] |
|
1 |
<span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> 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.
|
1 |
[CustomValidation(<span style="color: #0000ff">typeof</span>(DiscoValidator), <span style="color: #006080">"IsValidGenero"</span>)] |
|
1 |
<span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> Disco |
Declaramos que la clase Disco va a utilizar la validación IsValidGenero de la clase DiscoValidator.
Creamos la clase DiscoValidator.
|
1 |
<span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">class</span> DiscoValidator |
|
1 |
{ |
|
1 |
<span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">bool</span> IsValidGenero(<span style="color: #0000ff">object</span> discoObject, |
|
1 |
ValidationContext context, |
|
1 |
<span style="color: #0000ff">out</span> ValidationResult validationResult) |
|
1 |
{ |
|
1 |
validationResult = <span style="color: #0000ff">null</span>; |
|
1 |
Disco disco = discoObject <span style="color: #0000ff">as</span> Disco; |
|
1 |
  |
|
1 |
<span style="color: #0000ff">if</span> (disco.Genero != Generos.Heavy) |
|
1 |
{ |
|
1 |
List<<span style="color: #0000ff">string</span>> properties = |
|
1 |
<span style="color: #0000ff">new</span> List<<span style="color: #0000ff">string</span>>() { <span style="color: #006080">"Genero"</span> }; |
|
1 |
  |
|
1 |
validationResult = |
|
1 |
<span style="color: #0000ff">new</span> ValidationResult(<span style="color: #006080">"Sólo puede cargar del genero Heavy"</span>, |
|
1 |
properties); |
|
1 |
} |
|
1 |
  |
|
1 |
<span style="color: #0000ff">return</span> (disco.Genero == Generos.Heavy); |
|
1 |
} |
|
1 |
} |
Validamos que el Genero cargado sea solamente el que especificamos.
Como vemos, en la parte inferior aparecen las validaciones correspondientes.
Pueden descargar el proyecto aquÃ.




1 comment
Julio Trujillo Leon says:
Jul 7, 2009
Hola Santiago
Felicitaciones por tu post.
Por probloemas técnicos resulta que después de pediros que publiquéis los ejemplos ahora el VS2008 no me deja ejecutarlos, me deriva al área “downloads” de MS para descargar un SP pero al instalarlo me da problemas con lo que no puedo correr vuestros ejemplos.
Tengo una duda, en la validación a nivel de lÃnea (al final de ésta) caso de no superar la validación de una columna dada ¿existe la posibilidad de que se posicione el cursor sobre la primera celda de la colección de errores que pudiera tener la lÃnea? De ese modo se irian subsanando los errores uno por uno hasta conseguir una linea con datos perfectos.
Un cordial saludo