Wie man wiederkehrende Eigenschaften in WPF MVVM Ansichtsmodellen loswerden kann

8

Ich richte eine WPF-Anwendung mit einem ViewModel ein, das viele Eigenschaften hat. Diese sind alle sehr repetitiv und ich frage mich, ob es einen Weg gibt, um das los zu werden. So sieht eine Eigenschaft aus, und ich habe etwa 8-10 von ihnen.

%Vor%     
uncletall 22.10.2013, 01:52
quelle

4 Antworten

2

Der erwähnte Thread enthält tatsächlich die Antwort, aber Sie müssen etwas graben. Ich werde die zwei besten Antworten zeigen, die ich dort gefunden habe.

Die erste Lösung besteht darin, eine ViewModelBase-Klasse zu implementieren, die die set-Methode in eine template-Methode einkapselt und mithilfe von lamda-Ausdrücken den Property-Namen abruft, sodass das Refactoring die Zeichenfolge des Eigenschaftsnamens nicht verletzt.

%Vor%

Verwendung:

%Vor%

Die zweite Lösung verwendet ein Dictionary, um die Eigenschaften in der Basisklasse zu speichern. Auf diese Weise müssen wir den alten Wert nicht weitergeben, da er in der Basisklasse gespeichert wird, und wir müssen keine Mitgliedsfelder erstellen, in denen die Werte für die Eigenschaften gespeichert werden. Ich mag diese Lösung am besten:

%Vor%

Verwendung wäre:

%Vor%

Lösung 1 basiert auf Ссылка und Ссылка

Lösung 2 basiert auf Ссылка

    
uncletall 22.10.2013, 05:56
quelle
4

Mein Vorschlag, wenn Ihre Anforderungen einfach sind, wäre, an Dritte zu gehen. Dies ist ein gelöstes Problem, dank einiger genialer Leute ...

Der einfachste Weg, wie Sie Ihren Code schreiben können, besteht darin, die INotifyPropertyChanged -Implementierung vollständig zu entfernen und Ihre Eigenschaften auf die minimale Weise wie folgt zu schreiben:

%Vor%

Fügen Sie dann Fody.PropertyChanged zu Ihrem Projekt hinzu (es befindet sich auf NuGet ) und markieren Sie Ihre Klasse mit dem Attribut [ImplementPropertyChanged] .

Fody wird während des Kompilierens einige clevere IL-Magie anwenden, die die Schnittstelle und den gesamten Code auf magische Weise implementiert - was bedeutet, dass Ihr geschriebener Code so einfach wie möglich ist und Ihr Endergebnis genau das ist, was Sie wollen.

Beachten Sie, dass Sie, wenn Sie sich an anderer Stelle im Code auf die INotifyPropertyChanged -Schnittstelle verlassen (das heißt, wenn Sie das Ereignis manuell in Code oder ähnlichem anhängen), Fody möglicherweise anders verwenden, weil die IDE Sie nicht erkennt habe die Schnittstelle implementiert. Glücklicherweise wird Fody auch in anderen Szenarien automatisch implementieren (zB: INotifyPropertyChanged in einer Klasse implementieren und Fody wird standardmäßig auch implementieren Sie die Ereignisgenerierung in Ihren Eigenschaften ).

    
Dan Puzey 22.10.2013 10:23
quelle
0

Es hängt von der Anforderung ab, ob alle Eigenschaften für denselben Zweck verwendet werden, wie name1, name2, name3 ... name10, wie Namen von 10 Personen auflisten, dann in eine andere Klasse einfügen und eine Sammlung binden der Klassentyp zu Items-Kontrolle in Ihrem XAML. oder binden Sie einfach eine ObservableCollection von string

Wenn jedoch jede der Eigenschaften ihren eigenen Zweck hat, kann sie dies nicht vermeiden, da Eigenschaften nichts anderes sind als Variablen, die unterschiedliche Werte enthalten. Jede Eigenschaft wird ihre eigene Absicht haben, und jede Operation wird je nach Logik im View-Modell variieren

    
Kumareshan 22.10.2013 02:40
quelle
0

Meine Lösung ist in der Nähe von uncletall aber mit einigen Änderungen für die Verwendung

%Vor%

XAML:

%Vor%

Der Vorteil dieses Beispiels besteht in der Kompilierungsüberprüfung auf Änderungen. Vollständiges Beispiel Link

    
Lonli-Lokli 22.10.2013 10:08
quelle

Tags und Links