Arbeitest Du mit WPF?
Ich habe bei meinem aktuellen Projekt folgenden Aufbau:
Eine ViewModel-Basisklasse, die Methoden wie GetValue und SetValue bereit hält. Die regelt dann auch das ganze mit PropertyChanged.
Diese Get- und SetValue-Methoden rufe ich dann im Getter und Setter der Properties auf. Die ViewModelBase-Klasse sammelt die Daten dann in einem Dictionary mit Name der Property als Key.
Außerdem implementiert die Klasse das
IDataErrorInfo-Interface. Zusätzlich habe ich dort ein die Methode AddValidator, die den Property-Namen und eine Methode bekommt, die den Wert der Property validieren woll. Bei jedem SetValue geht die Klasse erst durch die gesammelten Validierungs-Functions durch und sammelt die Fehler-Meldung für diese Property. Erst danach wird der Wert gesetzt.
Die WPF-View bindet dann an eine Property und ändert fleißig den Wert. Gleichzeitig prüft sie bei jedem Ändern, ob dabei ein Fehler aufgetreten ist, dafür nutzt sie das IDataErrorInfo-Interface.
Standardmäßig gibt es bereits ein Error-Template, wie der Fehler angezeigt wird.
In dem Zuge ist vielleicht auch das
INotifyDataErrorInfo-Interface ganz interessant, das kenne ich aber auch erst seit jetzt
Im ViewModel hast Du dann im Konstruktor eine Sammlung von AddValidator-Aufrufen, wo Du die Methoden übergibst, die die einzelnen Properties validieren. Die können dann auch schauen, ob eine Property überhaupt validiert werden soll oder darf. Du könntest dann z.B. noch eine boolean-Property halten, die dann fest legt ob eine andere bestimmte Property aktiv ist. Die View beobachtet diese bool-Property und kann dann beim false die betreffenden Felder deaktivieren.
Das mag auf den ersten Blick recht übertrieben wirken, aber ist meiner Meinung nach eine ziemlich sinnvolle Herangehensweise.
Außerdem mag ich den Gedanken nicht, dass irgendwelche Validierung in der View statt findet, schließlich soll die View nur anzeigen. Die Entscheidung, ob Daten korrekt sind, gehört meiner Meinung nach nicht dazu.
Außerdem lässt sich das gut in einer Basis-Klasse zusammen fassen.