Handleiding: Binding-validatie implementeren
In dit voorbeeld ziet u hoe u een ErrorTemplate en een stijltrigger gebruikt om visuele feedback te geven om de gebruiker te informeren wanneer een ongeldige waarde wordt ingevoerd, op basis van een aangepaste validatieregel.
Voorbeeld
De tekstinhoud van de TextBox in het volgende voorbeeld is gebonden aan de eigenschap Age
(van het type int) van een bindingsbronobject met de naam ods
. De binding is ingesteld voor het gebruik van een validatieregel met de naam AgeRangeRule
zodat als de gebruiker niet-numerieke tekens invoert of een waarde die kleiner is dan 21 of groter dan 130, een rood uitroepteken naast het tekstvak wordt weergegeven en er een knopinfo met het foutbericht wordt weergegeven wanneer de gebruiker de muisaanwijzer boven het tekstvak beweegt.
<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>
In het volgende voorbeeld ziet u de implementatie van AgeRangeRule
, die wordt overgenomen van ValidationRule en de methode Validate overschrijft. De methode Int32.Parse
wordt aangeroepen op de waarde om ervoor te zorgen dat deze geen ongeldige tekens bevat. De methode Validate retourneert een ValidationResult die aangeeft of de waarde geldig is op basis van of een uitzondering wordt opgevangen tijdens het parseren en of de leeftijdswaarde buiten de onder- en bovengrens valt.
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
In het volgende voorbeeld ziet u de aangepaste ControlTemplatevalidationTemplate
waarmee een rood uitroepteken wordt gemaakt om de gebruiker op de hoogte te stellen van een validatiefout. Besturingssjablonen worden gebruikt om het uiterlijk van een besturingselement opnieuw te definiƫren.
<ControlTemplate x:Key="validationTemplate">
<DockPanel>
<TextBlock Foreground="Red" FontSize="20">!</TextBlock>
<AdornedElementPlaceholder/>
</DockPanel>
</ControlTemplate>
Zoals in het volgende voorbeeld wordt weergegeven, is het ToolTip dat het foutbericht toont gemaakt met behulp van de stijl textBoxInError
. Als de waarde van HasError gelijk is aan true
, stelt de trigger de tooltips van de huidige TextBox in op de eerste validatiefout. De RelativeSource is ingesteld op Self, wat verwijst naar het huidige 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)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
Gegevensobject
Het volgende codefragment is het gegevensobject dat in de vorige codevoorbeelden wordt gebruikt. In de XAML wordt een exemplaar aangemaakt als een statische bron met de sleutel 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
Volledig voorbeeld
Zie bindvalidatievoorbeeldvoor het volledige voorbeeld.
Houd er rekening mee dat als u geen aangepaste ErrorTemplate opgeeft, de standaardfoutsjabloon visuele feedback geeft aan de gebruiker wanneer er een validatiefout optreedt. Zie 'Gegevensvalidatie' in Overzicht van gegevensbinding voor meer informatie. WPF biedt ook een ingebouwde validatieregel die uitzonderingen onderschept die tijdens de update van de bindingsbroneigenschap worden opgeworpen. Zie ExceptionValidationRulevoor meer informatie.
Zie ook
- Overzicht van gegevensbindingen
- How-to Onderwerpen
.NET Desktop feedback