我正在开发一个WPF应用程序,用MVVM练习Rx。
方案
我有一个带有组合(某些公司名称)和详细信息(公司日记)部分的视图(MVVM);当用户从组合框中选择一个项目时,我想填充 detail 部分。
使用WCF服务方法填充详细信息部分数据,该方法将公司名称作为输入并且任务<>作为输出。
问题
用户有时会快速连续选择组合框项目,这会导致我的窗口冻结。我认为,这可能是因为事件排队或由于wcf服务方法的缓慢结果。
因此,我正在考虑使用Rx的FromEvent模式(MVVM方式),它应该能够观察到ComboBox SelectedItem Change事件从wcf加载数据并跳过那些使用一些节流快速连续发生的事件。
我很欣赏任何关于MVVM的示例实现。
答案 0 :(得分: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;
}
}