かずきのBlog@hatena

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

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種類を用意しておいたので、メソッドのオーバーライドを見てみてください。

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