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 Ссылка
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:
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 ).
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
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