私はReactiveUIの使用例に苦労しています。これは簡単なことですが、「すぐに使える」サポートが必要です。しかし、私はそれを見つけることができません。ユーザが検索テキスト ReactiveCommandのキャンセルと再実行
- 検索文字列のテキストボックス:
シナリオでは、これらの機能を備えた基本的な検索インターフェースであります
:検索では、検索は次のように動作するはず進行
であります0
基本的には、新しいコマンドを開始する前に、現在実行中のコマンドをキャンセルするための「説得力のある例」を拡張しようとしています。
十分に簡単ですか?ええ、ReactiveCommandを使って正しく取得することはできません。これは私が持っているものです:
var searchTrigger = this.WhenAnyValue(vm => vm.SearchString)
.Throttle(TimeSpan.FromMilliseconds(500))
.Publish().RefCount();
var searchCmd = ReactiveCommand.CreateFromObservable(
() => Observable
.StartAsync(ct => CancellableSearch(SearchString, ct))
.TakeUntil(searchTrigger));
searchCmd.ToPropertyEx(this, vm => vm.Result);
searchCmd.IsExecuting.ToPropertyEx(this, vm => vm.IsSearching);
searchTrigger.Subscribe(_ => searchCmd.Execute(Unit.Default).Subscribe());
上記のコードはsearchCmd.IsExecuting
以外のすべての面で機能します。 searchCmd.CanExecute
の状態に関係なく、私は新しい検索を開始します。これにより、コマンドのシリアル操作を前提としているので、IsExecuting
は信頼できません。 Execute
の代わりにInvokeCommand
を使用することはできません。検索が進行中であるため、新しい検索が開始されないためです。
私は現在、ReactiveCommand
のない実用的な解決策を持っています。しかし、私はこの単純なユースケースがReactiveCommand
を使って簡単にサポートされるべきだと強く感じています。私は何が欠けていますか?
偉大な答え。ありがとう。実際に操作をシリアライズすることはオプションです。しかし、取り消しが完了するまでに時間がかかることがあるので、私は進行中の操作について「忘れて」いるだけで、すぐに新しいものを開始することを好むでしょう。 –