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>
<local: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 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 siguiente ejemplo se muestra el objeto ControlTemplate validationTemplate
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)[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, 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
.NET Desktop feedback