読者です 読者をやめる 読者になる 読者になる

nuits.jp blog

C#, Xamarin, WPFを中心に書いています。Microsoft MVP for Visual Studio and Development Technologies。なお掲載内容は個人の見解であり、所属する企業を代表するものではありません。

【Xamarin.Forms】DisplayAlertを表示するBehavior

みなさん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>

つぎのように動作します。

f:id:nuitsjp:20170402131037p:plain

ではコードを紹介しましょう。

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ならまた個別に紹介したいと思います。

という訳で、今日はここまで。
それではまた!