10

Ich verstehe die IObservable & IObserver sind Implementierungen des Observer-Muster und kann in ähnlichen Umständen verwendet werden. NET-Ereignisse.IObservable <T> und INotifyPropertyChanged - gibt es eine Verbindung

Ich fragte mich, ob es eine Beziehung zu INotifyPropertyChanged gibt?

Ich verwende derzeit INotifyPropertyChanged für die Datenbindung in Winforms & WPF-Anwendungen und fragte mich, ob ich IObservable in UI Datenbindung Szenarien verwenden kann?

Prost

AWC

Antwort

3

Es sei denn, WinForms und WPF Bindungen auch IObservable unterstützen, wird es nicht mit Änderungen im Modell aktualisiert helfen, die Benutzeroberfläche zu halten. Der Grund dafür, dass Sie INotifyPropertyChanged verwenden können, liegt daran, dass der Bindungscode in WinForms und WPF nach dieser Schnittstelle sucht. Wenn er implementiert wird, verwendet er das Ereignis, um die Benutzeroberfläche auf dem neuesten Stand zu halten.

+0

danke, aber nicht wirklich hilfreich, ich weiß, wie die Schnittstelle in Bezug auf die Bindung arbeitet – AwkwardCoder

+2

@AWC: Im Gegenteil, seine Erklärung befasst sich mit Ihren Fragen, vor allem Ihre letzte. –

+0

lässt sehen - Ich gebe an, dass ich bereits INotifyPropertyChanged verwende, also werde ich ein wenig Verständnis dafür haben, wie es mit Winforms \ WPF funktioniert, ich wollte über IObservable wissen und ob dies irgendwelche Anwendungsmuster in Winforms \ WPF hat, die die letzte ist Frage. Also nicht wirklich hilfreich ist es ... – AwkwardCoder

5

Von dem, was ich sammeln kann, gibt es keine Beziehung. Beobachter/.NET-Eventing sind zwei Möglichkeiten, um das Verhalten von Observer/Notification zu erreichen.

Die Antwort von Microsoft bestand darin, auf dem .NET-Ereignismuster aufzubauen und es nicht zugunsten manuell registrierter Observer-Objekte abzulehnen.

Einer meiner größten Fehler bei Ereignissen ist die Unfähigkeit, die Delegate-Kette bei Bedarf zu löschen, was zu einigen Managed-Memory-Leck-Szenarien führt. Zu diesem Zweck hat Microsoft das Konzept der schwachen Ereignisse eingeführt, das heißt, das Problem der nicht übereinstimmenden Zeitachsen für Observable/Observer anzugehen.

Sie können mehr über das WeakEvent-Muster here lesen.

Josh Smith hat eine Implementation des WeakEventManagers für INotifyPropertyChanged here veröffentlicht. Dies bietet eine (aus der Sicht des Speichers) sicherere Möglichkeit, Objekte, die Eigenschaften verändern, und ihre Beobachter miteinander zu verbinden.

+0

MVVM Foundation Projekt sieht tot aus, keine Aktivität in 2,5 Jahren – BlackICE

1

Wenn Sie IObserver/IObservable bedeuten, wie durch die Erweiterungen Rx definiert:

http://channel9.msdn.com/shows/Going+Deep/Kim-Hamilton-and-Wes-Dyer-Inside-NET-Rx-and-IObservableIObserver-in-the-BCL-VS-2010/

und:

http://themechanicalbride.blogspot.com/2009/07/introducing-rx-linq-to-events.html

Dann ist es wie Äpfel und Orangen.

INotifyPropertyChanged stellt nur eine gemeinsame Ereignisverbindung für Datenbindung/etc bereit, damit die Steuerelemente wissen, wann sie ihre gebundenen Werte aktualisieren müssen.

IObservable/IObserver ist eher wie "Abfragen mit Sequenzen von Ereignissen", aber selbst das ist eine schlechte Beschreibung.

Hmm ... ok, also weißt du, wie du Sachen in diese "Tasche", eine Sammlung genannt, legen kannst, und dann diese Sammlung abfragen (manuell oder mit einer LINQ-Anweisung), um die Werte herauszuholen, richtig? Es ist irgendwie so, aber anstatt Daten aus einer "Tasche" zu "ziehen", bekommt man Ereignisse, die zu dir "gepusht" werden.

Shameless Stecker, oder weitere confuse helfen könnten: http://blog.lab49.com/archives/3252

2

Zunächst einmal, ich bin ein bisschen neu zu Rx, so dementsprechend von mir nehmen.

Das sagte, ich denke, dass es eine große Chance für die Zusammenarbeit zwischen INotifyPropertyChanged und Rx IObservable gibt. Ich denke, es ist relativ offensichtlich, dass die Benutzeroberfläche an diesem Punkt um INPC herum aufgebaut ist. INPC ist jedoch auch eine primäre Methode zum Erkennen von Änderungen und Verwalten von Szenarien, bei denen ein Domänenmodell oder Ansichtsmodell Abhängigkeiten zwischen Objekten und Eigenschaften aufweist. Es sind diese Interdependenzen, die als gute Kandidaten für Rx erscheinen.

Mit INPC direkt zu arbeiten ist ein bisschen schwierig und etwas schmerzhaft. Viele magische Saiten, um damit umzugehen. Es ist auch ein bisschen schmerzhaft, nach einem Ereignis auf einem Objekt mehrere Ebenen in der Objektbaumstruktur zu sehen.

Aber wenn ich diese Interaktionen "reaktiv" modellieren kann, dann beginnen sich meine Ansichtsmodelle und Domänenmodelle etwas eleganter zu fühlen. Dies zeigt sich in der Eleganz von Projekten wie Bindable Linq, Continuous Linq, Obtics usw. Diese Bibliotheken machen es einfach, "Live-Werte" oder "Live-Sammlungen" zu erstellen, die automatisch Änderungen (ich wage es "reaktiv" zu sagen) aktualisieren. Continuous Linq hat sogar eine "reactive object" framework reaktive Programmierung zu tun, wenn auch ohne Rx.

Es scheint mir, dass die Synergien kommen, wenn wir Rx verwenden können, um das Modell und das Modell kohärent zu halten. Dann können wir die "bindbare Oberfläche" des Modell-/Ansichtsmodells an die INPC anpassen, indem wir weiterhin PropertyChanged nach Bedarf erhöhen. Ich habe ein Paar elegant extension methods gesehen, das eine Observable von INotifyPropertyChanged erzeugt. Es scheint, dass die andere Hälfte davon sein könnte, eine Infrastruktur zu schaffen, die von Rx zurück zu INPC übersetzt.

+0

+1 Dies ist genau das, was ich mir ansehen möchte. Auch recherchieren [ReactiveUI] (http://www.reactiveui.net/) – Benjol