nuits.jp blog

C#, Xamarin, WPFを中心に書いています。Microsoft MVP for Development Technologies。

Xamarin.Forms.BehaviorsPack 2.0.0 リリース:究極に簡単に全てのイベントへコマンドをバインドできるようになりました

個人的にはタイトルは煽りでもなんでもなく、本気のつもりです。

例えば、PageのAppearingイベント発生時にCommandを実行したい場合、次のように記述すればOKです。

<ContentPage ...
             bp:Pages.Appearing="{Binding AppearingCommand}"

Xamarin.Formsのすべての要素の、すべてのイベントに対応しています。

これまでであれば、EventToCommandBehaviorを利用して以下のように記述する必要がありました。

<ContentPage ...>
    <ContentPage.Behaviors>
        <bp:EventToCommandBehavior 
            EventName="Appearing" 
            Command="{Binding AppearingCommand}"/>
    </ContentPage.Behaviors>

コンパクトに記述できるようになったかと思います。

詳細は以下に記述します。

前提条件

  • Xamarin.Forms 3.0.0.482510 以降

使い方

基本的な使い方は大きく三つのパターンがあります。

  • イベントに応じてパラメーター無しでコマンドを実行する
  • イベントの特定のプロパティをパラメーターにコマンドを実行する
  • ListViewのSelectedItem専用の実行方法

イベントに応じてパラメーター無しでコマンドを実行する

コマンドはXamarin.Forms.BehaviorsPackで提供する添付プロパティを利用してバインドします。

添付プロパティは、次の命名規則に則って定義されていますので、任意のイベントに対応するプロパティを利用してください。

[要素名]s.[イベント名]

例えば、ListViewのItemSelectedイベントであれば、次のように記述します。

<ListView ...
    bp:ListViews.ItemSelected="{Binding SelectedFruitCommand}">

イベントの特定のプロパティをパラメーターにコマンドを実行する

発生したイベントの任意のプロパティを一つ指定して、コマンドを実行する事が可能です。ただしプロパティの型がUI要素(例えばPage)の場合は非対応です。これはView要素へViewModelから依存が発生するのは好ましくないと考えているためです。

添付プロパティは、次の命名規則に則って定義されていますので、任意のイベントに対応するプロパティを利用してください。

[要素名]s.[イベント名]Notify[プロパティ名]

例えば、ListViewのSelectedItemイベントでSelectedItemプロパティを渡したいのであれば、次のように記述します。

<ListView ...
    bp:ListViews.ItemSelectedNotifySelectedItem="{Binding SelectedFruitCommand}">

ListViewのSelectedItem専用の実行方法

ListViewでItemが選択された場合、イベント実行後に選択状態を開放したいという事が、ままあります。

その為、専用の添付プロパティを用意しています。

<ListView ...
    bp:ListViews.ItemSelectedClearSelectedItem="{Binding SelectedFruitCommand}">

他にも特殊用途の添付プロパティが欲しい場合は、こちらのIssueに登録してください。可能であれば対応いたします。

以上です。