Automatisch INotifyPropertyChanged
Gibt es eine Möglichkeit, automatisch benachrichtigt zu werden, der änderungen der Eigenschaft in einer Klasse, ohne zu schreiben, OnPropertyChanged in jedem setter? (Ich habe Hunderte von Eigenschaften, die ich möchte wissen, ob Sie sich geändert haben).
Anton schlägt dynamische proxies. Ich habe doch tatsächlich die "Burg" - Bibliothek, für etwas ähnliches in der Vergangenheit, und während er das tut reduzieren die Menge an code, die ich hatte zu schreiben, es Hinzugefügt, um die 30 Sekunden, um mein Programm-startup-Zeit (ymmv) - weil es eine runtime-Lösung.
Ich mich Fragen, ob es einen compile-time-Lösung, vielleicht mit Hilfe von compile-time-Attribute...
Slashene und TcKs geben Anregungen und erzeugt die sich wiederholenden code - leider nicht alle meine Eigenschaften sind ein einfacher Fall von m_Value = value - viele von Ihnen haben benutzerdefinierten code in der setter, also cookie-cutter-code aus schnipseln und xml sind nicht wirklich machbar für mein Projekt.
Ich denke, das T4 + Attribut-Methode zu implementieren INPC ist ziemlich süß.
Sieht aus wie die Antwort Nein, dann
Ich habe geholfen, um eine Klasse zum generieren einer proxy-on-the-fly Umsetzung
INotifyPropertyChanged
und änderungen-Erkennung: codeproject.com/KB/cs/INotifyPropertyChanged.aspxInformationsquelleAutor Tim Gradwell | 2009-02-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
EDIT: Der Autor NotifyPropertyWeaver veraltet das Werkzeug zu Gunsten der Allgemeinen Fody. (Ein migration guide für Menschen in Bewegung von weaver zu fody verfügbar ist.)
Ein sehr praktisches tool, das ich verwendet habe für meine Projekte ist
Notify Property WeaverFody.Es installiert sich als build-Schritt in Ihren Projekten und bei der Kompilierung injiziert code, wirft die
PropertyChanged
Veranstaltung.Machen Eigenschaften erhöhen PropertyChanged wird realisiert, indem Besondere Eigenschaften:
Als bonus, können Sie auch angeben, Beziehungen für Eigenschaften, die abhängig von anderen Eigenschaften
Vielen Dank für das lassen mich wissen. Scheint, das Projekt ist umgezogen zu github. Ich habe die links aktualisiert
tote links wieder
Fody / PropertyChanged greift automatisch nach Eigenschaft Abhängigkeiten, also im Beispiel die Bereich-Eigenschaft nicht benötigen [DependsOn("Radius")] - Attribut: das tool erkennt diese Abhängigkeit automatisch.
dies ist in diesem Beispiel der Fall, jedoch habe ich bemerkt, dass es besser ist, explizit zu definieren, die die meisten Abhängigkeiten, wie Fody nicht abholen alle von Ihnen.
InformationsquelleAutor Isak Savo
Den nameof-operator implementiert wurde in C# 6.0 .NET 4.6 und VS2015 im Juli 2015. Der folgende Code ist immer noch gültig für C# < 6.0
Verwenden wir den folgenden code (Aus http://www.ingebrigtsen.info/post/2008/12/11/INotifyPropertyChanged-revisited.aspx). Funktioniert Super 🙂
Verwendet, zum Beispiel so:
Einige syntax-Fehler in dem Beispiel existieren können. Nicht getestet. Aber Sie sollten das Konzept gibt es zumindest 🙂
EDIT: ich sehe jetzt, dass Sie haben können, wollte sogar weniger Arbeit, aber ja... die Sachen, die oben macht es zumindest sehr viel einfacher. Und Sie verhindern, dass alle unheimlich Probleme mit, die sich auf Eigenschaften, die mit strings.
+1 für die ganze Arbeit-Beispiel. Keep going!
Ich würde erwägen, a) die Umgestaltung Ihrer Ausdrucks -> Eigenschaft-name-code in eine andere Methode und b) die Lösung der Eigenschaft bevor abonnieren Sie den PropertyChanged-event (sonst läufst du, dass der code jedes mal)
Gute Idee. Fühlen Sie sich frei zu Bearbeiten, so stellen Sie sicher, dass es funktioniert zunächst, so dass wir am Ende nicht mit fehlerhaften code hier 🙂
InformationsquelleAutor Svish
Dem Framework 4.5 liefert uns die
CallerMemberNameAttribute
, die macht übergeben den Namen der Eigenschaft als string unnötige:Ähnlich Svish die Lösung, nur den Austausch lambda-awesomeness mit langweilig framework-Funktionalität 😉
Wenn Sie arbeiten, Framework 4.0 mit KB2468871 installiert ist, können Sie installieren Sie die Microsoft BCL Compatibility Pack über nuget, die auch dieses Attribut.
InformationsquelleAutor takrl
Können Sie extension-Methode auf die PropertyChanged-delegieren und verwenden Sie es wie diese:
Abonnement, um eine bestimmte Eigenschaft zu ändern:
Erweiterung die Methode ist in der Lage, um zu bestimmen, sender und name der Eigenschaft nur durch die Untersuchung lambda-Ausdruck Baum und ohne größere Auswirkungen auf die Leistung:
Wenn
PropertyChanged
Ereignis deklariert ist, in eine Basis geben, dann wird es nicht sichtbar sein als Delegierter Feld in den abgeleiteten Klassen. In diesem Fall ist ein workaround zu erklären, einen geschützten Bereich gebenPropertyChangedEventHandler
und explizit implementieren Veranstaltungadd
undremove
Accessoren:Ich habe ein workaround für abgeleitete Klassen.
Funktioniert Super - danke!!! Dies sollte wirklich als "Antwort" gekennzeichnet.
InformationsquelleAutor Konstantin Spirin
Implementieren, die eine sichere Typ -
INotifyPropertyChanged
: Siehe hierDann machen Sie Ihren eigenen code-snippet :
Mit Code-snippet designer und Sie getan haben ! Einfache, sichere Weg, um Ihr Körperbau INotifyPropertyChanged.
InformationsquelleAutor Nicolas Dorier
Weiß ich nicht, keine standard-Weg, aber ich kenne zwei workarounds:
1) PostSharp kann es für Sie tun, wenn die Kompilierung. Es ist sehr nützlich, aber es dauert einige Zeit für jede Version zu erstellen.
2) Custom-tool, mit dem ich Visual Studio. Sie können kombinieren Sie es mit einem "partial class". Dann erstellen Sie benutzerdefinierte tool für die XML-und Sie können die Generierung von Quellcode aus der xml.
Beispiel: dieser xml:
werden können Quelle für diesen code:
InformationsquelleAutor TcKs
vielleicht möchten Sie sich in die Aspekt-Orientierte Programmierung als ganzes
Frameworks => man konnte sich auf linfu
InformationsquelleAutor almog.ori
Kann man sich auf der Burg oder Spring.NET und Implementierung interceptor-Funktionalität?
InformationsquelleAutor Neil Barnwell
Habe ich gerade gefunden ActiveSharp - Automatische INotifyPropertyChanged, ich habe noch, es zu benutzen, aber es sieht gut aus.
Zitat von der web-site...
Statt, schreiben, Eigenschaften wie diese:
Beachten Sie, dass es gibt keine Notwendigkeit, den Namen der Eigenschaft als string. ActiveSharp zuverlässig und korrekt zahlen, die für sich selbst. Es funktioniert, beruht auf der Tatsache, dass Ihre Immobilie-Implementierung übergibt das Feld sichern (_foo) von ref. (ActiveSharp verwendet, dass "ref" aufrufen, um zu ermitteln, welche Feld sichern war vergangen, und aus dem Feld identifiziert die Eigenschaft).
InformationsquelleAutor Ian Ringrose
Verbesserung zu nennen, Veranstaltung in Kinder Klassen:
Aufgerufen durch:
diese.NotifyPropertyChange(() => PageIndex);
Fügen Sie diese in die NotificationExtensions Klasse:
InformationsquelleAutor champier
Einfach nur um die Umsetzung schneller können Sie eine snippet
Vom http://aaron-hoffman.blogspot.it/2010/09/visual-studio-code-snippet-for-notify.html
Snippet-core (für die full credit geht an den Autor, wer nicht für mich), ist die folgende
InformationsquelleAutor usr-local-ΕΨΗΕΛΩΝ
Gibt es keine Einzelne Implementierung der Eigenschaft Geändert hat, kann mit jeder Möglichkeit, dass die Menschen wollen, es zu benutzen. beste Wette ist, um zu generieren, eine helper-Klasse, um die Arbeit für Sie tun
hier ein Beispiel, das ich verwenden
Bearbeiten:
es wurde vorgeschlagen, dass ich den Wandel von einer helper-Klasse, um den Wert wrapper und ich habe seitdem mit diesem ein, und ich finde es funktioniert ganz gut
Beispiel verwenden
dann im constructor tun
Ich mag es. Ich habe etwas ähnliches gemacht, aber viel leichter (wie du schon erwähnt hast, jeder hat verschiedene Anforderungen). Ich habe angerufen mir ein EncapsulatedProperty<T>. Es hat eine Value-Eigenschaft, implizite Konvertierungen, und das ValueChanged-Ereignis. Hätte ich nur das wieder, wenn ich gefragt hätte meine Frage vor 7 Jahren, ich würde haben glücklich mit dieser Lösung 🙂
InformationsquelleAutor MikeT
Nutzen Sie einfach dieses Attribut über die automatische Deklaration einer Eigenschaft
PropertyChanged
wird nie ausgelöst durch diesen Mechanismus. Es muss etwas anderes sein.InformationsquelleAutor Amir