This post originated from an RSS feed registered with .NET Buzz
by -.
Original Post: WPF: Validierung von Eingaben
Feed Title: Norbert Eder - Living .NET
Feed URL: http://feeds.feedburner.com/NorbertEder-Livingnet
Feed Description: Copyright (c)2005, 2006 by Norbert Eder
Eingaben sollten immer validiert, also auf Korrektheit überprüft, werden, um Fehler bereits frühzeitig abzufangen und so eventuell einen langen Verarbeitungsweg einzusparen. Dieser Artikel zeigt, wie die Eingabe von Datumswerten in Textfelder unter WPF auf Gültigkeit hin überprüft werden können.
Einführung
In der Windows Presentation Foundation gibt es die sogenannten ValidationRules, welche an einem Databinding hängen und darüber auch verwendet werden können. Mit Hilfe dieser ValidationRules können nun Eingaben auf einfache Art und Weise überprüft werden. Es wird jedoch vorausgesetzt, dass der zu prüfende Wert per Databinding an das jeweilige Control gebunden wurde.
Erstellung einer ValidationRule
Das Erstellen einer ValidationRule ist sehr einfach gehalten. Dazu muss von der abstrakten Klasse System.Windows.Controls.ValidationRule abgeleitet werden. Weiters muss die abstrakte Methode Validate überschrieben werden. Diese bekommt als Parameter den geänderten Wert der Eingabe übermittelt, welcher in weiterer Folge überprüft werden muss. Als Ergebnis wird ein Objekt des Typs ValidationResult zurück geliefert. Darin wird vermerkt, ob die Validierung erfolgreich war (oder nicht) und ein Fehlerobjekt (das kann beispielsweise eine Fehlermeldung sein).
Für das hier gezeigte Beispiel wird eine ValidationRule für die Validierung eines Datums implementiert und kann wie folgt aussehen:
publicclass DateTimeValidationRule : ValidationRule
{
publicoverride ValidationResult Validate(
objectvalue,
System.Globalization.CultureInfo cultureInfo)
{
string val = valueasstring;
DateTime dtResult;
bool bRet = DateTime.TryParse(val, out dtResult);
ValidationResult vr = new ValidationResult(bRet, "No valid date");
return vr;
}
}
Damit ist die notwendige ValidationRule erstellt. Da diese jedoch nur auf ein Binding angewendet werden kann, wird noch eine Datenklasse benötigt, welche den entsprechenden Wert an unser Textfeld bindet.
Binding erstellen
Für das Binding wird eine einfache Datenklasse erstellt. Diese enthält nur den angezeigten Datumswert und wird bei der Instanzierung mit dem aktuellen Datum befüllt (siehe Konstruktor).
publicclass MyData
{
privatestring _date;
publicstring Date
{
get { return _date; }
set { _date = value; }
}
public MyData()
{
_date = DateTime.Now.ToShortDateString();
}
}
Der nächste Schritt besteht nun darin, ein Window mit den entsprechenden Feldern und dem Binding zu erstellen.
WPF Window und Bindings erstellen
Für das Fenster der Testanwendung müssen einige kleine Punkte erledigt werden. So ist die Datenquelle anzubinden, eine TextBox zu erstellen und das DataBinding zu setzen. Weiters muss dem DataBinding die ValidationRule bekannt gemacht werden, sowie ein entsprechender Trigger gesetzt werden (PropertyChanged). Letztere Schritt wird benötigt, um Änderungen an der Eingabe zu erkennen und dadurch die Validierung zu starten.
In den Ressourcen für das Window wird im ersten Schritt die Datenquelle für das Binding angegeben. my ist lediglich ein Namespace, welcher auf das aktuelle Projekt verweist, damit die Klasse MyData gefunden werden kann.
Interessant ist der definierte Style, welcher an den Typ TextBox gebunden wird und einen Trigger auf die Eigenschaft Validation.HasError besitzt. Dieser wird also immer dann ausgelöst, wenn die Validierung einen Fehler zurück liefert. Ist dies der Fall, wird die Schriftfarbe gesetzt, als auch der ToolTip befüllt (dieser ist zuständig, um die zurück gelieferte Fehlermeldung anzuzeigen).
Schließlich fehlt noch die Definition des Textfeldes, welches der grundlegende Bestandteil dieser Demo ist.
Es wird deutlich, dass hier sowohl ein ErrorTemplate zugewiesen wird und ein entsprechender Style. Zudem findet ein Binding auf unsere zuvor definierte Datenquelle statt. Dieser wird ein UpdateSourceTrigger zugewiesen, der bei einer Veränderung des eingegebenen Wertes die ValidationRule startet. In diesem Fall DateTimeValidationRule, welche zu Beginn dieses Artikels erstellt wurde.
Der Rest besteht eigentlich nur darin, um die TextBox herum die grundlegenden Bestandteile eines Fensters zu definieren. In diesem Beispiel wurde mit einem Grid gearbeitet, was durchaus auch an der Definition des Textfeldes zu erkennen ist.
Fazit
Mit diesem Beispiel sollte es nun möglich sein, eigene Validierungen für Felder zu implementieren. Es ist durchaus sinnvoll, ein wenig mit dem oben gezeigten Code zu experimentieren und einige Einstellungen etc. zu ändern, um daraus zu lernen.