みなさんWPF用のMVVMインフラストラクチャであるLivetをご存知ですか?
ふとしたきっかけで、Livetの機能を見ていて
「指定されたEventでダイアログを表示し、その後ViewModelをよびだす」
機能が、Xamarin.Formsでも使えると便利だなと思いました。
そこで指定EventでDisplayAlertを表示しAcceptボタンが押されたときにCommandを事項するBehaviorを作成してみました。
前提条件
Prism 6.3で追加されたEventToCommandBehaviorを継承して作成しています。
Prism非依存で利用したい場合は、Prismのコードも参考に移植してください。
利用イメージ
XAMLに、つぎのようなBehaviorを追加します。
ButtonのClickedイベントが発生したら、DisplayAlertを表示し、「Ok」を押下さえた時にViewModelに定義されている「UpdateTitleCommand」を実行するイメージです。
<Button Text="Click!"> <Button.Behaviors> <behavior:DisplayAlertBehavior EventName="Clicked" Title="Title" Message="Hello, DisplayAlertBehavior." Accept="Ok" Cancel="Cancel" Command="{Binding UpdateTitleCommand}"/> </Button.Behaviors> </Button>
つぎのように動作します。
ではコードを紹介しましょう。
DisplayAlertBehavior
つぎのとおりです。
DisplayAlertBehavior for Xamarin.Forms
いくつかポイントをあげて説明しましょう。
ベースクラスとしてPrism for Xamarin.FormsのEventToCommandBehaviorを継承して実装しています。
イベントが発生した場合、OnEventRaisedメソッドが呼び出されるため、これをオーバーライドして振る舞いをカスタマイズしています。
OnEventRaisedの中で、現在のPageを利用してDisplayAlertを表示しています。currentPageの取得方法はもう少し良い方法があるかもしれませんが、ひとまずはこの形で。なんかNavigationStackが空になるケースがあった気がするのですが思い出したら修正します。
DisplayAlertBehaviorの使い方
こんな感じです。
How to use DisplayAlertBehavior
さいごに
DisplayAlertがこうできるなら、ActionSheetもやりたいですよね?基本は同じでできますが、けっこう手間はかかりそうです。
汎用的にできそうなので、ちょっとPrism本体に提案してみてNGならまた個別に紹介したいと思います。
という訳で、今日はここまで。
それではまた!