かずきのBlog@hatena

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

ReactiveProperty Portable 0.4.2-beta3をNuGetにおいてみました。地味にXamarinでもいけるように

ReactiveProperty Portable 0.4.2-beta3をNuGetに放流してみました。今朝、たなかさんに教えてもらった方法でXamarinでもRx-Mainをインストールできるようになったので、それでさくっと。

XamarinだとXAMLのBiningがなくて悲しいので、とりあえず以下のような名前空間を追加しました。

  • Codeplex.Reactive.Binding
    • RxPropertyExtensionsクラス
      • BindTo拡張メソッドでPOCOのプロパティとReactivePropertyの同期をとれるようにしました
    • RxCommandExtensionsクラス
      • ReactiveCommandのToEventHander拡張メソッドでイベントハンドラに変換できるようにしました。

Xamarinの新規作成したときのカウントアップアプリをRxPropertyで

プロジェクトを新規作成してNuGetでReactivePropertyをインストールします。リリース前のパッケージを含めるようにする点を注意してください。(コマンドラインだと-Pre)

そして、とりあえず、ViewModelを用意します。

class Activity1ViewModel
{
    public ReactiveProperty<int> Counter { get; private set; }

    public ReactiveProperty<string> Message { get; private set; }

    public ReactiveCommand Increment { get; private set; }

    public Activity1ViewModel()
    {
        this.Counter = new ReactiveProperty<int>(mode: ReactivePropertyMode.None);
        this.Message = this.Counter
            .Select(i => string.Format("{0}回クリックしました", i))
            .ToReactiveProperty("クリックしてください");

        this.Increment = new ReactiveCommand();
        this.Increment.Subscribe(_ => this.Counter.Value++);
    }
}

ここらへんはふつうのReactivePropertyと同じなので割愛。Activity1のコンストラクタで、ボタンなどのViewと接続します。

protected override void OnCreate(Bundle bundle)
{
    base.OnCreate(bundle);

    var dataContext = new Activity1ViewModel();

    // Set our view from the "main" layout resource
    SetContentView(Resource.Layout.Main);

    // Get our button from the layout resource,
    var button = FindViewById<Button>(Resource.Id.MyButton);

    // CommandのToEventHandlerメソッドでボタンのイベントと接続
    button.Click += dataContext.Increment.ToEventHandler();
    // ReactivePropertyのBindToでボタンのTextプロパティと接続
    dataContext.Message.BindTo(button, b => b.Text);
}

一応、BindToメソッドにはOneWay(これがデフォルト), TwoWay, OneWayToSourceの3種類を用意しておいたので、メソッドのオーバーライドを見てみてください。

一応動いたけど、これからどうしよう。