ReactiveProperty Portable 0.4.2-beta3をNuGetに放流してみました。今朝、たなかさんに教えてもらった方法でXamarinでもRx-Mainをインストールできるようになったので、それでさくっと。
XamarinだとXAMLのBiningがなくて悲しいので、とりあえず以下のような名前空間を追加しました。
- Codeplex.Reactive.Binding
- RxPropertyExtensionsクラス
- BindTo拡張メソッドでPOCOのプロパティとReactivePropertyの同期をとれるようにしました
- RxCommandExtensionsクラス
- ReactiveCommandのToEventHander拡張メソッドでイベントハンドラに変換できるようにしました。
- RxPropertyExtensionsクラス
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種類を用意しておいたので、メソッドのオーバーライドを見てみてください。
一応動いたけど、これからどうしよう。