Ich beginne mit der Verwendung von ValidationRules in meiner WPF-Anwendung, aber ziemlich verwirrt.ValidationRule mit ValidationStep = "UpdatedValue" wird mit BindingExpression anstelle des aktualisierten Werts aufgerufen
Ich habe die folgende einfache Regel:
class RequiredRule : ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
if (String.IsNullOrWhiteSpace(value as string))
{
return new ValidationResult(false, "Must not be empty");
}
else
{
return new ValidationResult(true, null);
}
}
}
in XAML wie folgt verwendet:
<TextBox>
<TextBox.Text>
<Binding Path="Identity.Name">
<Binding.ValidationRules>
<validation:RequiredRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
Diese meist funktioniert, wie ich erwarten würde. Ich war überrascht zu sehen, dass meine Quelleigenschaft (Identity.Name
) nicht gesetzt wurde; Ich habe eine Rückgängig-Funktion, die nie die Änderung sieht, und es gibt keine Möglichkeit, den Wert zurückzusetzen, außer es neu einzugeben (nicht gut).
Microsofts Data Binding Overview beschreibt den Validierungsprozess im unteren Bereich, der dieses Verhalten sehr gut erklärt. Basierend darauf würde ich meinen ValidationStep
auf UpdatedValue
setzen lassen wollen.
<validation:RequiredRule ValidationStep="UpdatedValue"/>
Dies ist, wo Dinge für mich komisch werden. Anstatt, dass Validate() aufgerufen wird, wobei der Objektwert der Eigenschaftswert ist, der gesetzt wurde (d. H. Eine Zeichenfolge), erhalte ich eine System.Windows.Data.BindingExpression
! Ich sehe nichts in der Microsoft-Dokumentation, die dieses Verhalten beschreibt.
Im Debugger kann ich das Quellobjekt (DataContext
von TextBox
) sehen, den Pfad zur Eigenschaft navigieren und sehen, dass der Wert festgelegt wurde. Ich sehe jedoch keine gute Möglichkeit, innerhalb der Validierungsregel zur richtigen Eigenschaft zu gelangen.
Hinweis: Mit ValidationStep
als ConvertedProposedValue
, bekomme ich die eingegebene Zeichenfolge (ich habe keinen Konverter in Verwendung), aber es blockiert auch die Aktualisierung der Quelleigenschaften, wenn die Validierung wie erwartet fehlschlägt. Mit CommittedValue
bekomme ich die BindingExpression
anstelle der Zeichenfolge.
Es gibt mehrere Fragen hier:
Warum erhalte ich einen inkonsistentes Argument Typen() auf der Grundlage der ValidationStep Einstellung zu bestätigen weitergegeben werden?
Wie kann ich den tatsächlichen Wert von der BindingExpression erhalten?
Gibt es alternativ eine gute Möglichkeit, dem Benutzer die TextBox in den vorherigen (gültigen) Status zurückzusetzen? (Wie ich bereits erwähnt, meine eigene Undo-Funktion sieht nie die Änderung.)
Ich bin überrascht, überhaupt keine Rückmeldung zu sehen, vor allem, da dies aufgewertet wurde. Für mich scheint dies der Höhepunkt des ValidationRule-Ansatzes zu sein, der ansonsten sehr gut und intuitiv aussieht. Ist es besser, IDataErrorInfo zu verwenden, obwohl es im Vergleich klobig erscheint? – mbmcavoy