Benutzer mit den meisten Antworten
Auf Validator.ValidateProperty(value, New ValidationContext(... reagieren

Frage
-
Hallo,
ich habe eine Validation eingebaut. Der Code sieht folgendermaßen aus:
Code in MainPage.xaml:
<TextBox x:Name="txKapital"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Margin="16,0,0,0"
Width="120"
TextAlignment="Right"
Text="{Binding Kapital, Converter={StaticResource KapitalConverter}, Mode=TwoWay, UpdateSourceTrigger=Default, ValidatesOnExceptions=true, NotifyOnValidationError=true}" />
In einer Klasse "DataInput" gibt es die Eigenschaft "Kapital". Die Eingabe in der Textbox wird validiert über eine Regular Expression, die beim Update der Klassen-Eigenschaft "Kapital" geprüft wird:
Private _kapital As Double
<RegularExpression("^[0-9]{1,6}(\,[0-9]{1,2}|[0-9]{0,0})$", ErrorMessage:="Ungültige Eingabe")> _
<Display(Name:="Kapital", Description:="Zu verzinsendes Kapital eingeben.")> _
Public Property Kapital() As Double
Get
Return _kapital
End Get
Set(ByVal value As Double)
' Test:
Validator.ValidateProperty(value, New ValidationContext(Me, Nothing, Nothing) With {.MemberName = "Kapital"})
' End Test
_kapital = value
OnPropertyChanged(New PropertyChangedEventArgs("Kapital"))
End Set
End Property
Ich arbeite mit Data Annotations und die Validierung funktioniert: Wird ein Wert eingegeben, der nicht zur Regular Expression paßt, dann reagieren Code und UI.
Meine Frage:
Wie kann ich per Code darauf reagieren, wenn die Validierung nicht erfolgreich ist?
Nach meiner Vorstellung müßte das irgendwie über die Auswertung eines der Parameter von ValidationContext erfolgen. Ich habe schonmal in der Library geschaut aber nichts gefunden.
Beste Grüße,
M. (LawBot)Sonntag, 27. Dezember 2009 09:04
Antworten
-
Hallo,
ich habe die Lösung selbst gefunden.
Die Lösung läuft über das Abfangen des BindingValidationError-Events in dem Steuerelement, dem der DataContext zugewiesen worden ist. Also: In meinem Code ist der DataContext dem StackPanel (spFirstRow) zugewiesen, in dem sich die TextBox (txKapital) befindet (DataInput heißt die Klasse für das Datenobjekt):
Private di As DataInput
Private Sub MainPage_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
di = New DataInput
spFirstRow.DataContext = di
End Sub
Wenn nun bei der Validierung in meiner Datenklasse DataInput im Setter der Kapital-Eigenschaft (siehe Code im Thread meiner Ausgangsfrage) ein BindingValdationError ausgelöst wird, so kann das im StackPanel (spFirstRow) zur weiteren Verarbeitung abgefangen werden:
Private Sub spFirstRow_BindingValidationError(ByVal sender As Object, ByVal e As System.Windows.Controls.ValidationErrorEventArgs) Handles spFirstRow.BindingValidationError
If e.Action = ValidationErrorEventAction.Added Then
txKapital.Background = New SolidColorBrush(Colors.Red)
btBerechnen.IsEnabled = False
ElseIf e.Action = ValidationErrorEventAction.Removed Then
txKapital.Background = New SolidColorBrush(Colors.White)
btBerechnen.IsEnabled = True
End If
End Sub
Im obigen Beispielcode wird der Background der TextBox, in der der Eingabefehler erfolgte, zusätzlich Rot dargestellt und der Button btBerechnen deaktiviert. Erst wenn der Nutzer seinen Eingabefehler durch einen zulässigen Eingabewert ersetzt hat, wenn also e.Action = ValidationErrorEventAction.Removed ist, wird der TextBox-Background wieder normal dargestellt und der btBerechnen wieder aktiviert.
Schlank und cool!
Beste Grüße,
M. (LawBot)- Als Antwort markiert Martin Krüger Montag, 28. Dezember 2009 09:01
Sonntag, 27. Dezember 2009 16:19
Alle Antworten
-
Hallo,
ich habe die Lösung selbst gefunden.
Die Lösung läuft über das Abfangen des BindingValidationError-Events in dem Steuerelement, dem der DataContext zugewiesen worden ist. Also: In meinem Code ist der DataContext dem StackPanel (spFirstRow) zugewiesen, in dem sich die TextBox (txKapital) befindet (DataInput heißt die Klasse für das Datenobjekt):
Private di As DataInput
Private Sub MainPage_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
di = New DataInput
spFirstRow.DataContext = di
End Sub
Wenn nun bei der Validierung in meiner Datenklasse DataInput im Setter der Kapital-Eigenschaft (siehe Code im Thread meiner Ausgangsfrage) ein BindingValdationError ausgelöst wird, so kann das im StackPanel (spFirstRow) zur weiteren Verarbeitung abgefangen werden:
Private Sub spFirstRow_BindingValidationError(ByVal sender As Object, ByVal e As System.Windows.Controls.ValidationErrorEventArgs) Handles spFirstRow.BindingValidationError
If e.Action = ValidationErrorEventAction.Added Then
txKapital.Background = New SolidColorBrush(Colors.Red)
btBerechnen.IsEnabled = False
ElseIf e.Action = ValidationErrorEventAction.Removed Then
txKapital.Background = New SolidColorBrush(Colors.White)
btBerechnen.IsEnabled = True
End If
End Sub
Im obigen Beispielcode wird der Background der TextBox, in der der Eingabefehler erfolgte, zusätzlich Rot dargestellt und der Button btBerechnen deaktiviert. Erst wenn der Nutzer seinen Eingabefehler durch einen zulässigen Eingabewert ersetzt hat, wenn also e.Action = ValidationErrorEventAction.Removed ist, wird der TextBox-Background wieder normal dargestellt und der btBerechnen wieder aktiviert.
Schlank und cool!
Beste Grüße,
M. (LawBot)- Als Antwort markiert Martin Krüger Montag, 28. Dezember 2009 09:01
Sonntag, 27. Dezember 2009 16:19