本エントリーではPrism6.3で新たに追加された機能をいくつか紹介します。
EventToCommandBehavior
皆さん待望のEventToCommandBehaviorが追加されました。
あ、Prismとは別にXamarin.Forms用のBehaviorライブラリでいいのがあるんですよ。良かったらこちらもお試しください(ダイマ
さてEventToCommandBehaviorは、コントロールから発生するイベントの内、対応するCommandのバインディングが用意されていない場合に利用します。
たとえば、ListViewのItemTappedイベントの場合はこんな感じで利用します。
<ListView ItemsSource="{Binding Fruits}"> <ListView.Behaviors> <behaviors:EventToCommandBehavior EventName="ItemTapped" Command="{Binding SelectedFruitCommand}"/> </ListView.Behaviors>
タップされた時にSelectedFruitCommandが呼び出されます。
このコードではTapされたItemが何か分かりませんが、ItemTapped発生時のイベントオブジェクトではるItemTappedEventArgsのItemプロパティにはTapされたオブジェクトが設定されています。PrismのEventToCommandBehaviorでは良くあるIValueConverterで頑張る以外の方式として、発生したイベントのプロパティのパスを指定してCommandに渡すことができます。
かしこい!
こんな感じです。
<ListView ItemsSource="{Binding Fruits}"> <ListView.Behaviors> <behaviors:EventToCommandBehavior EventName="ItemTapped" Command="{Binding SelectedFruitCommand}" EventArgsParameterPath="Item"/> </ListView.Behaviors>
そしてこう受け取ります。
public ICommand SelectedFruitCommand => new Command<Fruit>(fruits => { ... });
これ以外にも一般的な、CommandParameterやIValueConverter、ConverterParameterなどにも対応しています。
利用頻度の高いBehaviorですから、含まれるのはありがたいですね。
IApplicationLifeCycleの追加
PageやViewModelでIApplicationLifeCycleを実装することで、ApplicationのSleepとResumeのイベント通知を受信できるようになりました。
アプリケーションが非表示・表示された際に呼び出されますので、作業中の状態の保存や復元に利用できます。
ただ、AndroidとiOSで微妙に振る舞いが違うという話を聞いたことがあります。現在、どのように振舞うのか分かりませんので利用する際には調査した方が良いでしょう。
IApplicationStore
DIコンテナからインジェクションさせることで、新たにIApplicationStoreが利用できるようになりました。
これはXamarin.FormsのApplicationクラスのPropertiesへのアクセスを容易にします。
https://developer.xamarin.com/api/property/Xamarin.Forms.Application.Properties/
インターフェースでインジェクションできるのでUnitTestがしやすくなる等の効果が期待できます。
IDeviceService
これもDIコンテナからインジェクションさせることで利用します。
Xamarin.FormsのDeviceクラスの利用を、インターフェースベースで利用できるようになる為、UnitTestが容易になるといった効果が期待できます。
以上でPrism6.3のXamarin.Forms関連のアップデートは全てになります。