Gewusst wie: Implementieren der Bindungsvalidierung
Dieses Beispiel veranschaulicht die Verwendung eines ErrorTemplate und eines Formattriggers zum Bereitstellen von visuellem Feedback, um den Benutzer zu benachrichtigen, wenn basierend auf einer benutzerdefinierten Validierungsregel ein ungültiger Wert eingegeben wird.
Beispiel
Der Textinhalt von TextBox im folgenden Beispiel ist an die Age-Eigenschaft (vom Typ int) eines Bindungsquellen-Objekts mit dem Namen ods gebunden. Die Bindung ist so eingerichtet, dass eine Validierungsregel mit dem Namen 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, wenn der Mauszeiger über das Textfeld geführt 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>
<c:AgeRangeRule Min="21" Max="130"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
Das folgende Beispiel veranschaulicht die Implementierung von 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. Dies 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
{
private int _min;
private int _max;
public AgeRangeRule()
{
}
public int Min
{
get { return _min; }
set { _min = value; }
}
public int Max
{
get { return _max; }
set { _max = value; }
}
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 + ".");
}
else
{
return new ValidationResult(true, null);
}
}
}
Das folgende Beispiel zeigt das benutzerdefinierte ControlTemplate validationTemplate, mit dem ein rotes Ausrufezeichen erstellt wird, das den 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 dargestellt, wird der ToolTip mit der Fehlermeldung mit dem textBoxInError-Stil erstellt. Wenn der Wert von HasError true ist, legt der Trigger die QuickInfo des aktuellen TextBox auf den ersten Validierungsfehler fest. Die RelativeSource wird auf Self festgelegt und verweist so 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>
Das vollständige Beispiel finden Sie unter Beispiel für Bindungsvalidierung.
Beachten Sie Folgendes: Wenn Sie kein benutzerdefiniertes ErrorTemplate bereitstellen, wird dem Benutzer durch die standardmäßige Fehlervorlage visuelles Feedback gegeben, wenn ein Validierungsfehler vorliegt. Weitere Informationen finden Sie unter "Datenvalidierung" in Übersicht über Datenbindung. WPF bietet außerdem eine integrierte Validierungsregel, die die während der Aktualisierung der Bindungsquelleneigenschaft ausgelöste Ausnahmen abfängt. Weitere Informationen finden Sie unter ExceptionValidationRule.