IDataErrorInfo (Validierungen in einer eigenen Klasse festlegen)?

  • WPF MVVM
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von kafffee.

    IDataErrorInfo (Validierungen in einer eigenen Klasse festlegen)?

    Hallo zusammen :)

    ich arbeite mich gerade ins Thema Validierungen ein, und stoss da auf eine grundlegende Frage:

    Ist es generell möglich, seine Validierungen in einer extra-Klasse festzulegen (die natürlich IDataErrorInfo implementiert)?

    Mein Problem ist Folgendes: In meinem ViewModel hab ich mehrere Textboxen, in die alle ein gültiges Verzeichnis eingetragen werden soll.

    Kann ich da die Validation Rules alle in einer extra Klasse unterbringen und dann auf meine TextBoxen anwenden?

    Ich hab z.B. Folgendes in der View:

    XML-Quellcode

    1. <TextBox Style="{StaticResource txtFolder}" Text="{Binding MainModule.VSTVerzeichnis, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"/>


    Und das wäre die Klasse mit den Validierungsregeln drinne:

    VB.NET-Quellcode

    1. Public Class Validierung
    2. Implements IDataErrorInfo
    3. Public Property MainModule As Services.IZentraleKlasse = Services.ServiceContainer.GetService(Of Services.IZentraleKlasse)
    4. Default Public ReadOnly Property Item(columnName As String) As String Implements IDataErrorInfo.Item
    5. Get
    6. Select Case columnName
    7. Case "MainModule.VSTVerzeichnis"
    8. If Not System.IO.Directory.Exists(MainModule.VSTVerzeichnis) Then
    9. Return "Bitte lege hier ein gültiges Verzeichnis fest."
    10. End If
    11. Case Else
    12. Return ""
    13. End Select
    14. Return ""
    15. End Get
    16. End Property
    17. Public ReadOnly Property [Error] As String Implements IDataErrorInfo.Error
    18. Get
    19. Throw New NotImplementedException()
    20. End Get
    21. End Property
    22. End Class


    Wenn ich in Zeile 8 einen Haltepunkt mache und dann ausführe und ein ungültiges Verzeichnis eintrage, kommt das Programm nicht an diesem Haltepunkt an...

    Und in der Application.xaml hab ich das hier:

    XML-Quellcode

    1. <Style TargetType="{x:Type TextBox}" x:Key="txtFolder" BasedOn="{StaticResource {x:Type TextBox}}">
    2. <Style.Triggers>
    3. <Trigger Property="Validation.HasError" Value="true">
    4. <Setter Property="ToolTip"
    5. Value="{Binding RelativeSource={x:Static RelativeSource.Self},
    6. Path=(Validation.Errors)[0].ErrorContent}"/>
    7. </Trigger>
    8. </Style.Triggers>
    9. </Style>


    Mach ich irgendwas offensichtlich falsch?
    IDataErrorInfo ist ein alternatives Validierungs-Konzept zu ValidationRules.
    Entscheide dich für dieses oder jenes.
    Bei IDataErrorInfo nimmt dir Databinding eine menge ab, bei der Präsentation.
    Vielleicht baust du einfach mal ein Viewmodel mit IDataErrorInfo, und lässt es ein paar Fehler haben.
    Dann gugge, wie die View daraufhin ausssieht.


    Mit ValidationRules kenne ich mich nicht aus, evtl. hat man da mehr Freiheiten (aber sicherlich auch mehr Arbeit).
    Jedenfalls IDataErrorInfo gabs schon in WinForms (manche lehnen manches ja aus Prinzip ab, wenn es das schon länger gibt)

    Das mit der Extra-Klasse habich nicht verstanden.
    Beide Konzepte beziehen sich auf einen Datensatz. Und wenn du einen Datensatz anzeigst, bringts wohl nix, die Validierungs-Information in einer anderen Klasse zu haben.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Zu der Extraklasse:

    Ich hatte mir gedacht, warum nicht einfach, ähnlich wie bei einem Converter, alle Validierungsregeln in einer Klasse auslagern... Wenn ich also für verschiedene Textboxen die gleiche Validierung haben will... Frage ist ob das dann funktioniert....

    Zumal ich die Text-Properties meiner zu validierenden Textboxen nicht direkt zu Properties in meinem ViewModel gebunden hab, sondern in einem Service ausgelagert (MainModule).

    Also versteht der Compiler das wenn ich wie oben columnName auf "MainModule.VSTVerzeichnis" abfrage?

    Oder muss das zwingend ins gleiche ViewModel?
    Okay nur dass ich dich richtig verstehe: Der DataContext von meinem XAML muss dann Validierung sein?

    Kann ich denn eigentlich die Public ReadOnly Property Item auch umbenennen?

    @ErfinderDesRades

    Edit: Danke für die Tipps, hab genau gefunden was ich gesucht hab:

    learn.microsoft.com/de-de/dotn…w=netframeworkdesktop-4.8

    Edit2:

    Eine Frage hätte ich doch noch: Kann ich das Valideren irgendwie forcieren? Ich möchte dass schon beim Programmstart angezeigt wird wenn was nicht richtig ist. Bis jetzt ist es so, dass nur validiert wird, wenn ich händisch was verändere in der TextBox...

    Edit 3:

    Okay auch das hab ich gefunden:

    XML-Quellcode

    1. <Binding Path="MainModule.VSTVerzeichnis" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay">
    2. <Binding.ValidationRules>
    3. <vm:VerzeichnisGueltigRule CheckIfWritingPermission="False" ValidatesOnTargetUpdated="True"/>
    4. </Binding.ValidationRules>

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „kafffee“ ()