1

MVVMでRxを練習するWPFアプリを開発中です。

シナリオ

コンボ(会社名) と詳細(会社ジャーナル) セクションを含むビュー (MVVM) があります。ユーザーがコンボボックスからアイテムを選択したときに、詳細セクションにデータを入力したかったのです。

詳細セクションのデータは、会社名を入力として、Task<> を出力として受け取る WCF サービス メソッドの助けを借りて設定されます。

問題

ユーザーがコンボ ボックスの項目を立て続けに選択すると、ウィンドウがフリーズすることがあります。これは、イベントのキューアップが原因であるか、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 を使用しない実装例を次に示しますが、それがどのように適用されるかを確認できると確信しています。

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;
    }
}
于 2014-06-19T21:08:11.797 に答える