id:neueccさんがプルリクをくれました。最近多いですね!
今回追加された機能は、AsyncReactiveCommandクラスになります。Subscribeメソッドが非同期メソッドを受け取って、その非同期メソッドが実行中の間は自動的にCanExecuteをFalseにしてくれるというCommandです。今まで頑張って自前で実行中かどうかを判断してたのがいらなくなるんですね。はい。
こんな感じのViewModelが作れます。
using Reactive.Bindings; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Sample.ViewModels { public class AsyncReactiveCommandViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public AsyncReactiveCommand HeavyProcessCommand { get; } public AsyncReactiveCommand ShareSourceCommand1 { get; } public AsyncReactiveCommand ShareSourceCommand2 { get; } private ReactiveProperty<bool> ShareSource { get; } = new ReactiveProperty<bool>(true); public AsyncReactiveCommandViewModel() { this.HeavyProcessCommand = new AsyncReactiveCommand(); this.HeavyProcessCommand.Subscribe(async _ => await Task.Delay(3000)); this.ShareSourceCommand1 = this.ShareSource.ToAsyncReactiveCommand(); this.ShareSourceCommand1.Subscribe(async _ => await Task.Delay(3000)); this.ShareSourceCommand2 = this.ShareSource.ToAsyncReactiveCommand(); this.ShareSourceCommand2.Subscribe(async _ => await Task.Delay(3000)); } } }
今回はDelayを使ってますが、ここで本来重たい処理を書きます。ShareSourceCommandのほうは、同じReactivePropertyを共有することで、どちらかが実行中のときは、もう片方も実行できなくなるという便利な感じに動いてくれます。