Compartir a través de


Cómo: Implementar la validación de vinculaciones

En este ejemplo se muestra cómo usar un ErrorTemplate y un desencadenador de estilo que proporciona comentarios visuales para informar al usuario cuando se introduce un valor no válido, en función de una regla de validación personalizada.

Ejemplo

El contenido de texto de TextBox en el ejemplo siguiente está vinculado a la propiedad Age (de tipo int) de un objeto de origen de enlace denominado ods. La vinculación se configura para usar una regla de validación denominada AgeRangeRule de modo que si el usuario escribe caracteres no numéricos o un valor menor que 21 o mayor que 130, aparezca un signo de exclamación rojo junto al cuadro de texto y se muestre un mensaje emergente con el mensaje de error cuando el usuario mueve el ratón 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>
        <local: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 Validate método . Se llama al método Int32.Parse en el valor para asegurar que no contiene caracteres no válidos. El Validate método devuelve un ValidationResult valor 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 antigüedad está fuera de los límites inferiores y superiores.

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

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

        try
        {
            if (((string)value).Length > 0)
                age = int.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 personalizado ControlTemplatevalidationTemplate que crea una marca de exclamación roja para notificar al usuario 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 ejemplo siguiente, el ToolTip que muestra el mensaje de error se crea con el estilo denominado textBoxInError. Si el valor de HasError es true, el desencadenador establece la información sobre herramientas del actual TextBox en su primer error de validación. RelativeSource se establece en Self, que hace 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>

Objeto de datos

El fragmento de código siguiente es el objeto de datos usado en los ejemplos de código anteriores. Se crea una instancia en xaml como un recurso estático con la clave de ods:

public class MyDataSource
{
    public MyDataSource()
    {
        Age = 0;
        Age2 = 0;
    }

    public int Age { get; set; }
    public int Age2 { get; set; }
    public int Age3 { get; set; }
}
Public Class MyDataSource
    Public Sub New()
        Me.Age = 0
        Me.Age2 = 0
    End Sub

    Public Property Age As Integer
    Public Property Age2 As Integer
    Public Property Age3 As Integer
End Class

Ejemplo completo

Para obtener el ejemplo completo, consulte Ejemplo de validación de enlace.

Tenga en cuenta que, si no proporciona un ErrorTemplate personalizado, la plantilla de error predeterminada aparece para proporcionar retroalimentación visual al usuario cuando se produce un error de validación. Consulte "Validación de datos" en Descripción general del enlace de datos para obtener más información. Además, WPF proporciona una regla de validación integrada que detecta las excepciones que se producen durante la actualización de la propiedad de origen de enlace. Para obtener más información, consulte ExceptionValidationRule.

Consulte también