【问题标题】:WPF Combo and Rx FromEvent PatternWPF 组合和 Rx FromEvent 模式
【发布时间】:2013-07-29 10:04:30
【问题描述】:

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

场景

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

detail 部分数据是在 WCF 服务方法的帮助下填充的,该方法以公司名称为输入,任务为输出。

问题

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

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

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

【问题讨论】:

    标签: wpf mvvm wpf-controls system.reactive


    【解决方案1】:

    我认为您要查找的运算符是Switch()。我找不到它的 msdn 页面,但这是您想要的签名:

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

    这将采用IObservable&lt;Task&lt;T&gt;&gt; 并将其转换为IObservable&lt;T&gt;,从而产生最近收到的Task&lt;T&gt; 的结果。

    这是一个不使用任何 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      • 1970-01-01
      • 2012-04-17
      相关资源
      最近更新 更多