【发布时间】:2017-07-03 10:55:46
【问题描述】:
我正在使用 MVVM 应用程序并尝试让一个文本框文本更改寄存器运行一个命令,该命令可以在每次此文本框发生新更改时取消。 在 Reactive Extension 中,它是通过 Switch 方法完成的,如下所示:
Observable.FromEventPattern<PropertyChangedEventArgs>(this, nameof(PropertyChanged))
.Where(a => a.EventArgs.PropertyName == nameof(Item))
.Select(a => Item)
.DistinctUntilChanged()
.Throttle(TimeSpan.FromSeconds(0.5))
.ObserveOn(SynchronizationContext.Current)
.Do(x => { Items= null; })
.ObserveOn(Scheduler.Default)
.Select(item => { return Observable.FromAsync(cancellationToken => _itemService.GetItemsAsyncWithCancelation(item, cancellationToken)); })
.Switch()
.ObserveOn(SynchronizationContext.Current)
.Subscribe(items => Items = items);
当我尝试用 ReactiveUi 做同样的事情时,这就是我到目前为止的想法:
public ReactiveCommand GetItemsCommand { get; set; }
GetTowaryCommand = ReactiveCommand
.CreateFromTask<string>(async (x,cancelationToken) => Items = await _itemService.GetItemsAsyncWithCancelation(x.ToString(),cancelationToken));
this.WhenAnyValue(vm => vm.Item)
.Throttle(TimeSpan.FromSeconds(0.5))
.Do(_=> GetTowaryCommand.Dispose())
.ObserveOn(SynchronizationContext.Current)
.InvokeCommand(GetItemsCommand);
它正在工作,但我不确定 RestApi 调用是否被正确取消。 我试图遵循 ReactiveUI 文档中的示例: https://docs.reactiveui.net/en/user-guide/commands/canceling.html 但不知道如何将字符串参数 (x) 传递给 restApi 方法:
GetItemsCommand
.CreateFromObservable<string>(() => Observable.StartAsync(async (token) => Items = await _itemService.GetItemsAsyncWithCancelation(x.ToString(), token)))
【问题讨论】:
标签: c# asp.net-web-api reactiveui