Gewusst wie: Implementieren der Bindungsvalidierung
Dieses Beispiel veranschaulicht die Verwendung einer ErrorTemplate und eines Stiltriggers zum Bereitstellen von visuellem Feedback, um Benutzer*innen zu benachrichtigen, wenn basierend auf einer benutzerdefinierten Validierungsregel ein ungültiger Wert eingegeben wird.
Beispiel
Der Textinhalt des TextBox im folgenden Beispiel ist an die Age
-Eigenschaft (vom Typ „int“) eines Bindungsquellenobjekts mit dem Namen ods
gebunden. Die Bindung ist so eingerichtet, dass die Validierungsregel mit AgeRangeRule
verwendet wird. Wenn der Benutzer ein nicht numerisches Zeichen oder einen Wert kleiner als 21 oder größer als 130 eingibt, werden neben dem Textfeld ein rotes Ausrufezeichen und eine QuickInfo mit einer Fehlermeldung angezeigt, sobald der Mauszeiger über das Textfeld bewegt wird.
<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>
Das folgenden Beispiel zeigt die Implementierung der AgeRangeRule
, die von ValidationRule erbt und die Validate-Methode überschreibt. Die Int32.Parse
-Methode wird für den Wert aufgerufen, um sicherzustellen, dass keine ungültigen Zeichen enthalten sind. Die Validate-Methode gibt ein ValidationResult zurück, das angibt, ob der Wert gültig ist. Das Ergebnis basiert darauf, ob während der Analyse eine Ausnahme ausgelöst wird und ob der Alterswert außerhalb der Unter- und Obergrenzen liegt.
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
Das folgende Beispiel zeigt die benutzerdefinierte ControlTemplatevalidationTemplate
, mit der ein rotes Ausrufezeichen erstellt wird, das Benutzer auf einen Fehler bei der Validierung hinweist. Steuerelementvorlagen werden verwendet, um die Darstellung eines Steuerelements neu zu definieren.
<ControlTemplate x:Key="validationTemplate">
<DockPanel>
<TextBlock Foreground="Red" FontSize="20">!</TextBlock>
<AdornedElementPlaceholder/>
</DockPanel>
</ControlTemplate>
Wie im folgenden Beispiel gezeigt, wird der ToolTip mit der Fehlermeldung im textBoxInError
-Stil erstellt. Wenn HasError den Wert true
aufweist, legt der Trigger die QuickInfo des aktuellen TextBox auf den ersten Validierungsfehler fest. Die RelativeSource wird auf Self festgelegt und verweist damit auf das aktuelle 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>
Datenobjekt
Der folgende Codeausschnitt ist das Datenobjekt, das in den vorherigen Codebeispielen verwendet wird. Eine Instanz wird im XAML-Code als statische Ressource mit dem Schlüssel von 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
Vollständiges Beispiel
Das vollständige Beispiel finden Sie unter Beispiel für Bindungsvalidierung.
Beachten Sie Folgendes: Wenn Sie kein benutzerdefiniertes ErrorTemplate bereitstellen, wird den Benutzer*innen durch die standardmäßige Fehlervorlage visuelles Feedback gegeben, wenn ein Validierungsfehler vorliegt. Weitere Informationen finden Sie unter „Datenvalidierung“ in Übersicht über die Datenbindung. WPF bietet außerdem eine integrierte Validierungsregel, die die während der Aktualisierung der Bindungsquelleneigenschaft ausgelösten Ausnahmen abfängt. Weitere Informationen finden Sie unter ExceptionValidationRule.
Siehe auch
.NET Desktop feedback