1

我正在开发 WPF 应用程序以使用 MVVM 练习 Rx。

设想

我有一个带有组合(一些公司名称)和一个详细信息(公司日志)部分的视图(MVVM);当用户从组合框中选择一个项目时,我想填充详细信息部分。

详细信息部分数据是在 WCF 服务方法的帮助下填充的,该方法将公司名称作为输入,Task<> 作为输出。

问题

用户有时会快速连续选择组合框项目,这导致我的窗口冻结。我想,这可能是由于事件队列或由于 wcf 服务方法的缓慢结果。

因此,我正在考虑使用 Rx 的 FromEvent 模式(MVVM 方式),它应该能够观察 ComboBox SelectedItem Change 事件以从 wcf 加载数据并跳过使用一些节流阀快速连续发生的事件。

在尊重 MVVM 的同时,我很欣赏任何示例实现。

4

1 回答 1

3

我认为您正在寻找的运营商是Switch()。我找不到它的 msdn 页面,但这是您所追求的签名:

public static IObservable<TSource> Switch<TSource>(this IObservable<Task<TSource>> sources)

这将把IObservable<Task<T>>它变成一个IObservable<T>产生最近Task<T>收到的结果的结果。

这是一个不使用任何 MVVM 的示例实现,但我相信您可以看到它是如何应用的:

主窗口.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>

主窗口.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;
    }
}
于 2014-06-19T21:08:11.797 回答