Schnelle Generierung von ViewModel-Eigenschaften in wpf?

8

Nach dem Lesen von diesem Artikel habe ich den folgenden Code in meiner Klasse PersonViewModel :

%Vor%

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?

    
Oliver 16.04.2012, 12:57
quelle

8 Antworten

4

UPDATE: NotifyPropertyWeaver ist veraltet und setzt seine Lebensdauer als PropertyChanged.Fody . Dies ist eine absolut super coole Möglichkeit, dieses Problem zu lösen. Es ist eine Kompilierzeitlösung.

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."

    
Dan Puzey 16.04.2012, 13:32
quelle
9

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:

%Vor%

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.

%Vor%

Wenn Sie nun propchanged in Visual Studio eingeben, werden Sie nach dem Eigenschaftstyp und -namen gefragt und Code für Sie generiert.

%Vor%

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%     
Sergey Berezovskiy 16.04.2012 13:22
quelle
2

Nicht wirklich, wonach Sie suchen, aber als Nebenerscheinung können Sie zwei Zeilen pro Eigenschaft speichern, indem Sie Ihren Logiktest umkehren:

%Vor%     
GazTheDestroyer 16.04.2012 13:14
quelle
1

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%     
Rachel 16.04.2012 13:14
quelle
1

Versuchen Sie XAML PowerToys , um ViewModels schnell zu generieren;

    
Marshal 16.04.2012 13:19
quelle
1

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.

    
Peter Lillevold 16.04.2012 14:50
quelle
0

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

    
EvAlex 16.04.2012 13:11
quelle
0

Ich habe zu diesem Zweck eine kleine T4-Vorlage geschrieben.

Ссылка

    
Pompair 12.08.2014 12:49
quelle

Tags und Links