かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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