2016-07-06 15 views
4

Angenommen, ich bilde einen Bild-Editor mit Rx.Net. Der Benutzer kann die Leinwand mit der Maus bearbeiten. Die angewendete Manipulation hängt vom aktuell ausgewählten Werkzeug ab. Zum Beispiel könnte es ein Zeichenwerkzeug und ein Löschwerkzeug geben. Es kann immer nur ein Werkzeug ausgewählt werden.Wie erhalte ich den letzten bekannten Wert eines IObservable?

Ich habe drei Streams; eine für Mausereignisse; eine für Befehle, die durch Klicken mit der Maus ausgegeben werden; und eine andere für die Werkzeugauswahl:

IObservable<ITool> toolSelection; 
IObservalbe<MouseState> mouse; 
IObservable<ICommand> commands; 

commands Der Strom hängt von den beiden anderen: Befehle werden ausgegeben, wenn der Benutzer mit der Maus klickt, und der Befehl erzeugt wird, hängt von der zuletzt ausgewählten Werkzeug. Beachten Sie, dass ein Befehl nicht ausgegeben werden sollte, wenn der Benutzer Werkzeug ändert, nur wenn sie die Maus klicken.

Nun, ich könnte die zuletzt gewählte Werkzeug in einer Variablen wie folgt speichern:

var selectedTool = defaultTool; 
toolSelection.Subscribe(x => selectedTool = x); 

I selectedTool können die commands Stream bauen:

var commands = mouse.Select(x => selectedTool.CreateCommand(x)); 

Allerdings bedeutet dies nicht scheinen, wie die "reaktive" Art, Dinge zu tun. Kann ich die gleiche Logik mithilfe von Stream-Kompositionen erreichen?

Ich habe CombineLatest betrachtet, aber es verursacht unerwünschte Ereignisse, wenn der Benutzer das Tool wechselt. Ich möchte nur Befehle ausgeben, wenn der Benutzer klickt.

Antwort

4

Es klingt wie Sie brauchen .Switch().

Versuchen diesen Code:

IObservable<ICommand> commands = 
    toolSelection 
     .Select(t => mouse.Select(m => t.CreateCommand(m))) 
     .Switch(); 

Die Erweiterungsmethode .Switch(), in diesem Fall nimmt, ein IObservable<IObservable<ICommand>> und wandelt es in ein IObservable<ICommand> durch die neueste beobachtbar durch die äußeren beobachtbar und nur die Herstellung Wert daraus hergestellte Einnahme und Entsorgung von früheren.

Oder, wenn der Benutzer auf ein neues Tool klickt, erhalten Sie einen Stream von Mausbefehlen, die nur mit dem neuesten Tool in einer netten Abfrage erstellt wurden.

Verwandte Themen