Nach dem Lesen von diesem Artikel habe ich den folgenden Code in meiner Klasse PersonViewModel
:
Ich habe auch CountryDomiciled
, CountryPassport
und LegalJurisdiction
, alle mit demselben Format. Ebenso habe ich viele String
-Eigenschaften, die alle ihr Format teilen.
Dies führt zu vielen gleichen Codes! Jedoch kann ich nicht herausfinden, wie man das prägnanter macht.
Gibt es eine bessere Möglichkeit, diese Eigenschaften zu erzeugen, die sie stark typisiert halten?
UPDATE: NotifyPropertyWeaver ist veraltet und setzt seine Lebensdauer als PropertyChanged.Fody
Hier ist etwas, das Ihnen Code und Ärger erspart: NotifyPropertyWeaver
Mit dem oben beschriebenen Verfahren können Sie Ihre Eigenschaften ohne einen INotifyPropertyChanged
Code implementieren, und ein Build-Schritt übernimmt die Verkabelung für Sie.
Es ist ein einfaches Projekt-Include (auch über Nuget verfügbar), das die OnPropertyChanged
Callbacks automatisch in die Eigenschaften jeder Klasse einfügt, die INotifyPropertyChanged
implementiert. Es tut es zur Kompilierzeit (also kein Laufzeittreffer) und Ihr Code kann nur automatisch implementierte Eigenschaften haben (außer in Ihrem Fall, wo Sie ein separates Unterstützungsobjekt verwenden).
Es enthält sogar die Überprüfung der Wertgleichheit, so dass es die volle Logik abdeckt. Ich habe es nicht mit manuell implementierten Eigenschaften getestet, aber es lohnt sich, es auszuprobieren.
BEARBEITEN: Ich habe es jetzt getestet und es funktioniert gut: Eine manuell implementierte Eigenschaft wird "einfach funktionieren."
Ich benutze Snippet für Visual Studio, das eine Eigenschaft mit Backing-Speicher und Event-Raising für mich generiert. Erstellen Sie einfach eine XML-Datei mit dem Namen propchanged
(oder einen anderen Namen, falls Sie es wünschen) und folgendem Inhalt:
Und setze es in den Ordner C:\Users\YourName\Documents\Visual Studio 2010\Code Snippets\Visual C#\My Code Snippets\
.
Als Nächstes vererbe ich meine ViewModels von einem Basis-ViewModel, das INotifyPropertyChanged
intface implementiert und die geschützte Methode OnPropertyChanged
für das Generieren des 'PropertyChanged' -Ereignisses bereitstellt.
Wenn Sie nun propchanged
in Visual Studio eingeben, werden Sie nach dem Eigenschaftstyp und -namen gefragt und Code für Sie generiert.
UPDATE:
Eine weitere Option ist das Erzeugen von Code durch AOP-Framework wie PostSharp . In diesem Fall wird der Code generiert und während der Kompilierung hinzugefügt (damit bleiben Ihre Klassen sauber). Hier ist ein Beispiel für die Implementierung von INotifyProperty, die über PostSharp-Attribute geändert wurde:
%Vor%Nicht wirklich, wonach Sie suchen, aber als Nebenerscheinung können Sie zwei Zeilen pro Eigenschaft speichern, indem Sie Ihren Logiktest umkehren:
%Vor%Ich kenne keinen integrierten Weg, aber Sie könnten ein Makro aufzeichnen, das den Code für Sie generiert. Ich finde den einfachsten Weg das zu tun ist, einfach mit der Aufnahme eines Makros zu beginnen und dann alles, was Sie wollen, nur mit der Tastatur zu erstellen (Sie finden eine Liste praktischer Tastaturkürzel. hier )
Zum Beispiel habe ich eine, die die öffentliche Version einer Eigenschaft generiert, also muss ich nur private string _someValue;
eingeben und mein Makro drücken, und es wird die öffentliche Eigenschaft zusammen mit der Benachrichtigung über die Änderung der Eigenschaften generieren.
Beachten Sie dabei, dass es in MVVM absolut zulässig ist, das gesamte Modell aus Gründen der Einfachheit und Bequemlichkeit der Ansicht zu unterziehen. Anstatt also jede der Eigenschaften des Modells einzeln anzuzeigen, erstellen Sie einfach eine einzelne Eigenschaft für Ihr Model-Objekt.
%Vor%Und binden Sie an die Eigenschaften des Modells wie folgt:
%Vor%Um einen "stark typisierten" Verweis auf den Eigenschaftsnamen zu erhalten (der für das Refactoring erforderlich ist), Sie können Ausdrücke verwenden. Fügen Sie die folgende Methode, möglicherweise in einer Basisklasse für Ihre Viewmodels ein:
%Vor%In Ihren Ansichtsmodellen können Sie dann Folgendes tun:
%Vor%Refactoring-Eigenschaftsnamen werden nun automatisch übernommen, da die Referenz sich auf die tatsächliche Eigenschaft bezieht.
Dies löst den Problempunkt der Festcodierung von Eigenschaftsnamen, obwohl es immer noch die 4-5 Zeilen des Standardcodes benötigt. Aspektorientierte Ansätze wie notifypropertyweaver und PostSharp entfernt wirklich alle manuelle Kodierungen in den Viewmodels.
Haben Sie nicht versucht, Visual Studio-Codefragmente wie prop
oder propfull
zu verwenden? Tippen Sie es einfach ein und drücken Sie die Tab-Taste zweimal. Problem ist propfull
Snippet löst kein PropertyChanged Ereignis aus.
Aber eigentlich sollte es Drittanbieter-Snippets für solche Aufgaben geben. Hier ist, was ich gefunden habe: Property Snippet mit INPC