WPF 组合和 Rx FromEvent 模式

标签 wpf mvvm wpf-controls system.reactive

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

场景

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

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

问题

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

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

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

最佳答案

我认为您要找的运营商是 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;
    }
}

关于WPF 组合和 Rx FromEvent 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17921153/

相关文章:

wpf - 如何基于默认控件的样式创建样式?

wpf:如何在运行时添加超链接?

wpf - 对于 MVVM,viewmodel 将模型中的属性导出到 View 的最佳做法是什么?

wpf - 在运行时和设计时将 ViewModel 分配给 UserControl

c# - WPF ComboBox 自动完成中的 SelectedItem

wpf - 设置 WPF 布局网格背景(每个单元格、行、列)的样式

c# - 在 UserControl 中居中标签

c# - WPF MVVM : Binding to property of object

c# - 在 WPF 中对分类数据进行分组

wpf - 使用 Linq to Entities 绑定(bind)到 List<T> 时显示组合框的选定值的问题