Cómo: Implementar la validación de enlaces

Actualización: noviembre 2007

En este ejemplo se muestra cómo utilizar una propiedad ErrorTemplate y un desencadenador de estilo para informar visualmente al usuario cuando escribe un valor no válido, de acuerdo con una regla de validación personalizada.

Ejemplo

El contenido de texto del control TextBox en el ejemplo siguiente se enlaza a la propiedad Age (de tipo int) de un objeto de enlace de origen denominado ods. El enlace está configurado para utilizar una regla de validación denominada AgeRangeRule, de tal forma que si el usuario especifica caracteres no numéricos o un valor menor que 21 o mayor que 130, aparezca un signo de admiración rojo al lado del cuadro de texto y se muestre una información sobre herramientas con el mensaje de error cuando el usuario mueva el mouse sobre el cuadro de texto.

<TextBox Name="textBox1" Width="50" FontSize="15"
         Validation.ErrorTemplate="{StaticResource validationTemplate}"
         Style="{StaticResource textBoxInError}"
         Grid.Row="1" Grid.Column="1" Margin="2">
  <TextBox.Text>
    <Binding Path="Age" Source="{StaticResource ods}"
             UpdateSourceTrigger="PropertyChanged" >
      <Binding.ValidationRules>
        <c:AgeRangeRule Min="21" Max="130"/>
      </Binding.ValidationRules>
    </Binding>
  </TextBox.Text>
</TextBox>

En el ejemplo siguiente se muestra la implementación de AgeRangeRule, que hereda de ValidationRule e invalida el método Validate. Se llama al método Int32.Parse() para el valor, a fin de asegurarse de que no contiene ningún carácter no válido. El método Validate devuelve ValidationResult, que indica si el valor es válido; esto se determina en función de si se detecta una excepción durante el análisis y de si el valor de edad se encuentra fuera de los límites mínimo y máximo.

public class AgeRangeRule : ValidationRule
{
    private int _min;
    private int _max;

    public AgeRangeRule()
    {
    }

    public int Min
    {
        get { return _min; }
        set { _min = value; }
    }

    public int Max
    {
        get { return _max; }
        set { _max = value; }
    }

    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        int age = 0;

        try
        {
            if (((string)value).Length > 0)
                age = Int32.Parse((String)value);
        }
        catch (Exception e)
        {
            return new ValidationResult(false, "Illegal characters or " + e.Message);
        }

        if ((age < Min) || (age > Max))
        {
            return new ValidationResult(false,
              "Please enter an age in the range: " + Min + " - " + Max + ".");
        }
        else
        {
            return new ValidationResult(true, null);
        }
    }
}

En el ejemplo siguiente se muestra el objeto ControlTemplatevalidationTemplate personalizado que crea un signo de admiración rojo para notificar al usuario la existencia de un error de validación. Se utilizan plantillas de control para volver a definir el aspecto de un control.

<ControlTemplate x:Key="validationTemplate">
  <DockPanel>
    <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
    <AdornedElementPlaceholder/>
  </DockPanel>
</ControlTemplate>

Como se muestra en el ejemplo siguiente, el objeto ToolTip que muestra el mensaje de error se crea utilizando el estilo denominado textBoxInError. Si el valor de HasError es true, el desencadenador establece la información sobre herramientas del control TextBox actual en su primer error de validación. La propiedad RelativeSource se establece en Self, en referencia al elemento actual.

<Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
  <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
      <Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                        Path=(Validation.Errors)[0].ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

Para obtener el ejemplo completo, vea Ejemplo Binding Validation.

Tenga en cuenta que si no proporciona una propiedad ErrorTemplate personalizada, aparece la plantilla de error predeterminada para proporcionar información visual al usuario cuando se produce un error de validación. Vea "Validación de datos" en Información general sobre el enlace de datos para obtener más información. Asimismo, WPF proporciona una regla de validación integrada que detecta las excepciones iniciadas durante la actualización de la propiedad de origen de enlace. Para obtener más información, vea ExceptionValidationRule.

Vea también

Tareas

Demo Data Binding

Conceptos

Información general sobre el enlace de datos

Otros recursos

Ejemplos de enlace de datos

Temas "Cómo..." sobre enlace de datos