如何获取IObservable的最后一个已知值?

问题描述:

假设我正在使用Rx.Net构建图像编辑器。用户可以使用鼠标操作画布。应用的操作取决于当前选择的工具。例如,可能有一个“绘图”工具和一个“擦除”工具。一次只能选择一个工具。如何获取IObservable的最后一个已知值?

我有三条流;一个用于鼠标事件;一个用于通过点击鼠标发出的命令;另一个用于工具的选择:

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

commands流依赖于其它两个:当用户点击鼠标命令发送与命令生成依赖于最后选择的工具。请注意,当用户更改工具时,只有当用户单击鼠标时才会发出命令而不是。现在

,我可以在最后选择的工具存放在这样的变量:

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

我可以用selectedTool构建commands流:

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

然而,这似乎并没有就像“反应性”的做事方式一样。我可以使用流组合来实现这个相同的逻辑吗?

我已经看过CombineLatest,但它会导致用户切换工具时产生不需要的事件。我只想要在用户点击时发出命令。

这听起来像你需要.Switch()

尝试此代码:

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

扩展方法.Switch()需要,在这种情况下,IObservable<IObservable<ICommand>>并通过取最新观察的通过从它的外观察到的,只有生产值和产生其变为IObservable<ICommand>处置以前的。

或者用更多的英文术语来说,无论用户何时点击一个新工具,您都会在一个很好的查询中使用最新的工具构建一串鼠标命令。