読者です 読者をやめる 読者になる 読者になる

かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

ReactiveProperty v2.9.0とv3.0.0-pre5をリリースしました。

id:neueccさんがプルリクをくれました。最近多いですね!

www.nuget.org

今回追加された機能は、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を共有することで、どちらかが実行中のときは、もう片方も実行できなくなるという便利な感じに動いてくれます。