| 

.NET C# Java Javascript Exception

1
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.

Was übersehe ich hier?

Mein ControlTemplate
<ControlTemplate x:Key="errorTemplate">
<DockPanel>
<AdornedElementPlaceholder x:Name="placeholder" DockPanel.Dock="Top" />
<TextBlock Foreground="Red" FontWeight="Bold" DockPanel.Dock="Top" Margin="0 5 0 0"
Text="{Binding ElementName=placeholder, Path=AdornedElement.(Validation.Errors),
Converter={StaticResource errConv}, UpdateSourceTrigger=PropertyChanged}" />
</DockPanel>
</ControlTemplate>


Die zu validierende TextBox:
<TextBox Name="txtBox" Height="30" Width="200" Validation.ErrorTemplate="{StaticResource errorTemplate}">
<TextBox.Text>
<Binding Path="Message" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<local:StringEmptyValidator />
<local:IsDigitValidator />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>


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;
}
}
23.07.2011
Mario Priebe 6,0k 3 9
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.
jsc 25.07.2011
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.
Mario Priebe 25.07.2011
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?
jsc 25.07.2011
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
Mario Priebe 25.07.2011
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.
jsc 25.07.2011
1 Antwort
0
Mal so als Vorschlag:

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
26.07.2011
ffordermaier 8,4k 3 9

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH