Ermitteln des Aufrufers in einem Setter - oder unbemerktes Festlegen von Eigenschaften

8

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:

%Vor%

Alternativ ist es möglich, CallerMemberNameAttribute auf einen Eigenschaften-Setter anzuwenden?

    
McGarnagle 01.11.2013, 23:59
quelle

5 Antworten

13

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

%Vor%

Die Ausgabe:

%Vor%

Im Grunde ist das, was du verlangst, stackFrames[1].GetMethod().Name .

    
Tengiz 30.12.2013, 23:36
quelle
5

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.

    
Boluc Papuccuoglu 24.12.2013 23:58
quelle
1

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%     
Noctis 03.11.2013 01:33
quelle
1

Dies ist, was ich immer als Mittelweg zwischen INotifyPropertyChanged und meinen View-Modellen verwende:

%Vor%

Zwei Dinge hier. Es verwendet das Attribut [CallerMemberName] , um den Eigenschaftsnamen festzulegen. Dies macht die Syntax der Verwendung wie folgt:

%Vor%

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!

    
William Custode 31.12.2013 16:46
quelle
0

Immer wenn ich zusätzliche Informationen in eine VM eingeben musste, habe ich großen Erfolg mit der Verwendung von Befehlen:

Befehle, RelayCommands und EventToCommand

    
Eric Scherrer 31.12.2013 19:04
quelle