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?
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.
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%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:
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.
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
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: (
Tags und Links wpf c# inotifypropertychanged