WPF INotifyPropertyChanged für verknüpfte schreibgeschützte Eigenschaften

7

Ich versuche zu verstehen, wie ich die Benutzeroberfläche aktualisieren kann, wenn ich eine schreibgeschützte Eigenschaft habe, die von einer anderen Eigenschaft abhängig ist, so dass Änderungen an einer Eigenschaft beide Benutzeroberflächenelemente aktualisieren (in diesem Fall ein Textfeld und ein schreibgeschütztes Textfeld) Zum Beispiel:

%Vor%

Nach meinem Verständnis wird die Benutzeroberfläche nicht automatisch aktualisiert, wenn foo geändert wird. Was ist der richtige Weg, dies zu tun?

    
tbischel 26.08.2010, 18:38
quelle

7 Antworten

6

Eine Möglichkeit, um anzuzeigen, dass die Leiste geändert wurde, besteht darin, im Foo-Setter einen Aufruf an onPropertyChanged(this, "bar") hinzuzufügen. Hässlich, ich weiß, aber da hast du es.

Wenn foo in einer Vorgängerklasse definiert ist oder Sie anderweitig keinen Zugriff auf die Implementierung des Setter haben, können Sie das PropertyChanged-Ereignis abonnieren, so dass Sie auch eine Foo-Änderung auslösen können eine "bar" Änderungsbenachrichtigung. Das Abonnieren von Ereignissen auf der eigenen Objektinstanz ist ebenfalls hässlich, aber es wird den Job erledigen.

    
dthorpe 26.08.2010, 18:42
quelle
10

Ich weiß, dass dies eine alte Frage ist, aber es ist das erste Google-Ergebnis von "NotifyPropertyChanged von verknüpften Eigenschaften", daher denke ich, dass es angebracht ist, diese Antwort hinzuzufügen, damit es konkreten Code gibt.

Ich habe den Vorschlag von Robert Rossney verwendet und ein benutzerdefiniertes Attribut erstellt und dann im PropertyChanged-Ereignis des Basisansichtsmodells verwendet.

Die Attributklasse:

%Vor%

Und in meinem Basis-View-Modell (von dem alle anderen WPF-View-Modelle erben):

%Vor%

Dies erlaubt mir nun, Eigenschaften leicht zu markieren, so:

%Vor%     
Mage Xy 01.10.2015 16:18
quelle
8

Wenn dies ein schwerwiegendes Problem ist (durch "ernst", ich meine, Sie haben eine nicht-triviale Anzahl von abhängigen schreibgeschützten Eigenschaften), können Sie eine Abhängigkeitszuordnung erstellen, z. B .:

%Vor%

und verweisen Sie dann in OnPropertyChanged:

%Vor%

Dies unterscheidet sich nicht wesentlich von der Verwendung mehrerer OnPropertyChanged -Aufrufe im Foo -Setter, da Sie die Abhängigkeitskarte für jede neu hinzugefügte abhängige Eigenschaft aktualisieren müssen.

Aber es macht es möglich, ein PropertyChangeDependsOnAttribute nachträglich zu implementieren und Reflektion zu verwenden, um den Typ zu scannen und die Abhängigkeitskarte zu erstellen. So würde Ihre Eigenschaft etwa wie folgt aussehen:

%Vor%     
Robert Rossney 26.08.2010 20:15
quelle
5

Sie können einfach

anrufen %Vor%

von irgendwo in dieser Klasse ... Du kaltes geht sogar so:

%Vor%     
Tokk 26.08.2010 19:19
quelle
2

Wenn Sie die Leiste nur für UI-Zwecke verwenden, können Sie sie vollständig aus Ihrem Modell entfernen. Sie könnten das UI-Element an die Eigenschaft foo binden und einen benutzerdefinierten Wertkonverter verwenden, um das Ergebnis von foo in foo * foo zu ändern.

In WPF gibt es oft viele Möglichkeiten, dasselbe zu erreichen. Oft gibt es keinen richtigen Weg, nur eine persönliche Präferenz.

    
mdm20 26.08.2010 20:52
quelle
0

Abhängig von den Kosten der Berechnung und davon, wie häufig Sie davon ausgehen, dass es verwendet wird, kann es vorteilhaft sein, eine private Mengeneigenschaft zu erstellen und den Wert zu berechnen, wenn foo festgelegt ist bar get wird aufgerufen. Dies ist im Grunde eine Caching-Lösung, und Sie können dann die Benachrichtigung über die Änderung der Eigenschaften als Teil des privaten Setter bar ausführen. Ich bevorzuge diesen Ansatz im Allgemeinen, hauptsächlich weil ich AOP (über Postsharp) verwende, um den tatsächlichen INotifyPropertyChanged -Bastellaufbau zu implementieren.

-Dan

    
Dan Bryant 26.08.2010 19:12
quelle
0

Ich bin mir ziemlich sicher, dass es auf eine deklarative Art möglich sein muss, aber mein erster Versuch, dieses Problem zu lösen, war ein Misserfolg. Die Lösung, die ich erreichen möchte, verwendet Lambda Expressions, um dies zu definieren. Da Ausdrücke analysiert werden können (??), sollte es möglich sein, die Ausdrücke zu analysieren und an alle NotifyPropertyChanged-Ereignisse anzuhängen, um über Änderungen von abhängigen Daten benachrichtigt zu werden.

In ContinousLinq funktioniert das hervorragend für Sammlungen.

%Vor%

Leider fehlt mir das fundamentale Know-how in Expressions und Linq: (

    
Thomas Haller 21.02.2011 13:04
quelle

Tags und Links