locked
Auf Validator.ValidateProperty(value, New ValidationContext(... reagieren RRS feed

  • 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)
    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)
    Sonntag, 27. Dezember 2009 16:19
  • vielen Dank dass du die Lösung hier gepostet hast.

    Hat mir das fehlende Puzzle-Teil in den Schoss gelegt, Danke Dir!

     

    Gruss

    GL

    Mittwoch, 15. Dezember 2010 07:52