お探しのオペレーターは だと思いますSwitch()
。そのための msdn ページが見つかりませんでしたが、これはあなたが求めている署名です:
public static IObservable<TSource> Switch<TSource>(this IObservable<Task<TSource>> sources)
これは を取り、IObservable<Task<T>>
それを に変換して、IObservable<T>
最新のTask<T>
受信結果を生成します。
MVVM を使用しない実装例を次に示しますが、それがどのように適用されるかを確認できると確信しています。
MainWindow.xaml
<Window x:Class="LastFromCombo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel>
<ComboBox Name="cbx" />
<TextBlock Name="result" />
</StackPanel>
</Grid>
</Window>
MainWindow.xaml.cs
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.cbx.ItemsSource = Enumerable.Range(0, 100);
Observable.FromEventPattern<SelectionChangedEventArgs>(this.cbx, "SelectionChanged")
.Select(ev => ev.EventArgs.AddedItems.Cast<object>().FirstOrDefault())
.Select(GetDetails)
.Switch()
.ObserveOnDispatcher()
.Subscribe(detail => this.result.Text = detail);
}
private static async Task<string> GetDetails(object data)
{
await Task.Delay(TimeSpan.FromSeconds(3.0));
return "Details from " + data;
}
}