gpt4 book ai didi

WPF 组合和 Rx FromEvent 模式

转载 作者:行者123 更新时间:2023-12-03 10:23:29 25 4
gpt4 key购买 nike

我正在开发 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com