Ich hab ein kleines Problem mit der Aktualität meiner Validierung. Ich habe für ein Element mehrere ValidationRules definiert, die ich über einen Converter binde.
Füge ich nur eine Regel ein, funktioniert es, jedoch bei mehreren Regeln gibt es Probleme. Meine Regeln:
Nur Zahlen erlaubt (IsDigitValidator)
Muss ausgefüllt sein (StringEmptyValidator)
Gebe ich nun einen nichtnumerischen Wert ein, validiert dieser richtig und es wird ein Fehler markiert. Ändere ich das Zeichen in eine Zahl wird noch immer richtig validiert und die Fehlerbenachrichtigung wird wieder entfernt.
Entferne ich nun alle Zeichen dann schlägt richtigerweise der StringEmptyValidator zu, jedoch wenn ich nun einen nichtnumerischen Wert eingebe, bleibt der Validierungs-Text der StringEmpty-Regel stehen. Hier müsste jedoch die IsDigit-Validierung angezeigt werden.
Meine Validatoren (Ist nur LernCode, hier wird nix auf Fehler geprüft)
public class MyStringValidator : ValidationRule { public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) { var val = (string)value; if(String.IsNullOrWhiteSpace(val) || val.Length < 5) return new ValidationResult(false, "Mindestlänge 5 Zeichen");
return new ValidationResult(true, null); } }
public class MyStringIsNoDigitValidator : ValidationRule { public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) { var val = (string)value; if (!String.IsNullOrWhiteSpace(val) && !IsDigit(val)) return new ValidationResult(false, "Nur Zahlen erlaubt");
return new ValidationResult(true, null); }
private bool IsDigit(string val) { foreach (var v in val) { if (!char.IsDigit(v)) return false; } return true; } }
Ich habe bisher jeweils immer nur einen Validator verwendet. Kann dein IsDigitValidator nicht auch gleich prüfen, ob überhaupt etwas eingegeben wurde? Ein leeres Feld ist schließlich auch keine Zahl. Ich habe das bisher so gemacht und noch nicht so ein Problem gehabt.
Vielen Dank für deinen Antwort. Könnte man, klar. Jedoch ist das nicht Sinn der Sache. Ich möchte meinen Code schon gerne separieren und wenn WPF mir die Möglichkeit bietet, eine Collection von Regeln hinzuzufügen, dann würde ich diese auch gerne nutzen.
Dann lass doch mal einen Blick auf die Validatoren werfen. Evtl. biegst du dort irgendwo falsch ab; bzw. werden in diesem speziellen Fall überhaupt beide Validatoren aufgerufen und gibt es auch keine Exception darin?
Die beiden Regeln sind übrigens nur Beispiele, ich habe den Namen StringEmpty falsch gewählt, hier wird eine Zeichenlänge geprüft. Ich werde meine Frage um die Validatoren ergänzen
Hm, sieht zunächst einmal o.k. aus. Wie ist denn das Verhalten, wenn du, nachdem du das Feld leer gemacht hast, eine Zahl eingibst und diese dann durch einen Buchstaben ersetzt (ohne das Feld erneut zu leeren)? Validation.Errors ist meines Wissens nach ein Liste von Fehlern, die möglicherweise in deinem Fall nicht geleert wird, da sofort ein neuer Fehler auftritt. Wenn du dann Validation.Errors auswertest, bekommst du vermutl. erst einmal noch den alten Fehlertext.
Wenn mehrere ValidationRules zusammen nicht funktionieren, bestünde doch die Möglichkeit, eine CompositeValidationRule zu entwickeln, der Du dann die gewünschten Rules übergibst. Damit hast Du wieder eine ValidationRule, die dann eben ein Gesamtergebnis über alle Kind-ValidationRules zurückliefert. Damit ließe sich durchaus auch eine nachvollziehbare Ordnung auf den ValidationRules definieren, falls notwendig.
Vielleicht hilfts Dir ja als Denkanstoß weiter. Gruß Florian
Wie ist denn das Verhalten, wenn du, nachdem du das Feld leer gemacht hast, eine Zahl eingibst und diese dann durch einen Buchstaben ersetzt (ohne das Feld erneut zu leeren)?
Validation.Errors ist meines Wissens nach ein Liste von Fehlern, die möglicherweise in deinem Fall nicht geleert wird, da sofort ein neuer Fehler auftritt. Wenn du dann Validation.Errors auswertest, bekommst du vermutl. erst einmal noch den alten Fehlertext.