Cómo: Implementar la validación de enlacesHow to: Implement Binding Validation

En este ejemplo se muestra cómo usar un ErrorTemplate y un desencadenador de estilo para proporcionar comentarios visuales para informar al usuario cuando se escribe un valor no válido, en función de una regla de validación personalizada.This example shows how to use an ErrorTemplate and a style trigger to provide visual feedback to inform the user when an invalid value is entered, based on a custom validation rule.

EjemploExample

El contenido de texto del TextBox en el ejemplo siguiente se enlaza a la propiedad Age (de tipo int) de un objeto de origen de enlace denominado ods.The text content of the TextBox in the following example is bound to the Age property (of type int) of a binding source object named 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.The binding is set up to use a validation rule named AgeRangeRule so that if the user enters non-numeric characters or a value that is smaller than 21 or greater than 130, a red exclamation mark appears next to the text box and a tool tip with the error message appears when the user moves the mouse over the text box.

<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.The following example shows the implementation of AgeRangeRule, which inherits from ValidationRule and overrides the Validate method. Se llama al método Int32.Parse en el valor para asegurarse de que no contiene ningún carácter no válido.The Int32.Parse method is called on the value to make sure that it does not contain any invalid characters. El método Validate devuelve un ValidationResult que indica si el valor es válido en función de si se detecta una excepción durante el análisis y si el valor de edad está fuera de los límites inferior y superior.The Validate method returns a ValidationResult that indicates if the value is valid based on whether an exception is caught during the parsing and whether the age value is outside of the lower and upper bounds.

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 ejemplo siguiente se muestra el validationTemplate de ControlTemplate personalizado que crea un signo de exclamación rojo para notificar al usuario de un error de validación.The following example shows the custom ControlTemplate validationTemplate that creates a red exclamation mark to notify the user of a validation error. Las plantillas de control se usan para redefinir la apariencia de un control.Control templates are used to redefine the appearance of a control.

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

Como se muestra en el ejemplo siguiente, el ToolTip que muestra el mensaje de error se crea con el estilo denominado textBoxInError.As shown in the following example, the ToolTip that shows the error message is created using the style named textBoxInError. Si el valor de HasError es true, el desencadenador establece la información sobre herramientas del TextBox actual en el primer error de validación.If the value of HasError is true, the trigger sets the tool tip of the current TextBox to its first validation error. La RelativeSource se establece en Self, haciendo referencia al elemento actual.The RelativeSource is set to Self, referring to the current element.

<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 ejemplo de validación de enlace.For the complete example, see Bind Validation sample.

Tenga en cuenta que si no proporciona un ErrorTemplate personalizado, aparece la plantilla de error predeterminada para proporcionar información visual al usuario cuando se produce un error de validación.Note that if you do not provide a custom ErrorTemplate the default error template appears to provide visual feedback to the user when there is a validation error. Vea "Validación de datos" en Información sobre el enlace de datos para obtener más información.See "Data Validation" in Data Binding Overview for more information. Además, WPFWPF 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.Also, WPFWPF provides a built-in validation rule that catches exceptions that are thrown during the update of the binding source property. Para obtener más información, vea ExceptionValidationRule.For more information, see ExceptionValidationRule.

Vea tambiénSee also