Gibt es bei einer Standardmodellimplementierung, wenn sich eine Eigenschaft ändert, eine Möglichkeit, den Urheber der Änderung zu bestimmen? Mit anderen Worten, im folgenden Ansichtsmodell möchte ich, dass das "sender" -Argument des "PropertyChanged" -Ereignisses das tatsächliche Objekt ist, das den Prop1
setter aufgerufen hat:
Alternativ ist es möglich, CallerMemberNameAttribute
auf einen Eigenschaften-Setter anzuwenden?
Wenn ich richtig verstanden habe, fragen Sie nach dem Aufrufer des Setter. Das heißt, die vorherige Methode ruft den Aufrufstapel auf, bevor sie zum Setter selbst gelangt (was auch eine Methode ist).
Verwenden Sie hierfür die Methode StackTrace.GetFrames
. Zum Beispiel (aus Ссылка ):
Die Ausgabe:
%Vor% Im Grunde ist das, was du verlangst, stackFrames[1].GetMethod().Name
.
Meine erste Annäherung an Ihr Problem wäre, von PropertyEventArgs abzuleiten. Die neue Klasse hätte ein Member namens PropertyChangeOrigin zusätzlich zu PropertyName. Wenn Sie RaisePropertyChanged aufrufen, geben Sie eine Instanz der neuen Klasse mit dem PropertyChangeOrigin-Set aus den Informationen aus dem CallerMemberName-Attribut an. Jetzt, wenn Sie das Ereignis abonnieren, könnte der Abonnent versuchen, die Ereignisargumente in Ihre neue Klasse zu übertragen und die Informationen zu verwenden, wenn die Besetzung erfolgreich ist.
Haben Sie sich die CallerMemberName msdn angeschaut Seite ?
Ich verwende es, um RaisePropertyChanged("some_name_here");
zu vermeiden, indem ich dies in einer Basisklasse habe, und dann rufen alle Eigenschaften einfach RaisePropertyChanged();
auf.
Ich glaube, es könnte auch im Setting verwendet werden ...
Bearbeiten:
Wie in der Kommentarfrage, hier ist ein bisschen Code, der es tun wird (albern, aber trotzdem, wird tun, was gefragt wurde:)
%Vor%Wenn ich dann im Setter schreibe:
%Vor%Sie werden in der Ausgabe (beachten Sie die mittlere Zeile, fügte den Rest hinzu, so dass Sie sehen, es ist eine Konsole Ausgabe):
%Vor% Dies ist, was ich immer als Mittelweg zwischen INotifyPropertyChanged
und meinen View-Modellen verwende:
Zwei Dinge hier. Es verwendet das Attribut [CallerMemberName]
, um den Eigenschaftsnamen festzulegen. Dies macht die Syntax der Verwendung wie folgt:
Darüber hinaus speichert es das PropertyChangedEventArgs
-Objekt in einem Wörterbuch, so dass es nicht oft für Eigenschaften erstellt wird, die häufig festgelegt werden. Ich glaube, das spricht Ihr Problem an. Viel Glück!
Immer wenn ich zusätzliche Informationen in eine VM eingeben musste, habe ich großen Erfolg mit der Verwendung von Befehlen:
Tags und Links c# mvvm c#-5.0 inotifypropertychanged