Cómo: Implementar la validación de enlaces

Este ejemplo muestra cómo utilizar un elemento ErrorTemplate y un desencadenador de estilo para proporcionar comentarios visuales para informar al usuario cuando se especifica un valor no válido, según una regla de validación personalizada.

Ejemplo

El contenido del texto del elemento TextBox en el siguiente ejemplo se enlaza a la propiedad Age (de tipo int) de un objeto de origen de enlace denominado ods. El enlace se configura para usar una regla de validación denominada AgeRangeRule, por lo que si el usuario especifica caracteres no numéricos o un valor inferior a 21 o superior a 130, aparece un signo de exclamación junto al cuadro de texto y aparece información sobre herramientas con el mensaje de error cuando el usuario coloca 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 de código 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 en el valor para asegurarse de que no contiene caracteres no válidos. El método Validate devuelve un ValidationResult que indica si el valor es válido según si se ha detectado una excepción durante el análisis y si el valor de la edad está fuera de los límites inferior y superior.

public class AgeRangeRule : ValidationRule
{
    public int Min { get; set; }
    public int Max { get; set; }

    public AgeRangeRule()
    {
    }

    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}.");
        }
        return ValidationResult.ValidResult;
    }
}
Public Class AgeRangeRule
    Inherits ValidationRule

    ' Properties
    Public Property Max As Integer
    Public Property Min As Integer
        
    ' Methods
    Public Overrides Function Validate(value As Object, cultureInfo As CultureInfo) As ValidationResult
        Dim num1 As Integer = 0
        Try 
            If (CStr(value).Length > 0) Then
                num1 = Integer.Parse(CStr(value))
            End If
        Catch exception1 As Exception
            Return New ValidationResult(False, $"Illegal characters or {exception1.Message}")
        End Try
        If ((num1 < Min) OrElse (num1 > Max)) Then
            Return New ValidationResult(False, $"Please enter an age in the range: {Min}-{Max}.")
        End If
        Return ValidationResult.ValidResult
    End Function

End Class

En el siguiente ejemplo se muestra ControlTemplatevalidationTemplate personalizado que crea un signo de exclamación rojo para avisar al usuario de un error de validación. Las plantillas de control se usan para redefinir la apariencia de un control.

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

Como se muestra en el siguiente ejemplo, se crea la ToolTip que muestra el mensaje de error con un estilo llamado textBoxInError. Si el valor de HasError es true, el desencadenador establece la información sobre herramientas del elemento TextBox actual en su primer error de validación. RelativeSource se establece en Self, haciendo 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)/ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

Para obtener el ejemplo completo, vea este ejemplo de enlace de validación.

Tenga en cuenta que si no proporciona un elemento ErrorTemplate personalizado, aparece la plantilla de error predeterminada para proporcionar comentarios visuales al usuario cuando haya un error de validación. Vea "Validación de datos" en Información sobre el enlace de datos para obtener más información. Además, WPF proporciona una regla de validación incorporada que selecciona las excepciones que se producen durante la actualización de la propiedad del origen de enlace. Para obtener más información, vea ExceptionValidationRule.

Vea también