- Commandを直接バインドできないイベントへCommandをバインドする
MVVMパターンを実装しているとよく遭遇する「あるある」に
「特定のイベントが発行されたらViewModelのCommandを実行したいのにCommandがバインドできない!」
というものがあります。
そこでPrismではEventToCommandBehavior
を提供しており、それを利用することで、あらゆるイベントから簡単にCommandを実行できる手段を提供しています。
ここでは、MainPage起動時のAppearing
イベント発生時に、画面の表示メッセージを更新するよう実装します。
具体的な手順は次の通りです。
MainPageViewModel.cs
にAppearing
イベントに対応するCommandを定義するMainPage.xaml
にEventToCommandBehavior
を定義する
MainPageViewModel.cs
にCommandを定義し、Command実行時にMessage
を更新するよう実装します。
public ICommand AppearingCommand => new Command(() => Message = $"Appearing on {DateTime.Now}");
つづいてPageのAppearing
イベント発生時に、AppearingCommand
を実行するよう、MainPage.xaml
を更新します。
ContentPage
の属性に「xmlns:behaviors=~」の宣言を追加するのを忘れないように注意しましょう。
変更前
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:PrismHandsOn"
x:Class="PrismHandsOn.Views.MainPage">
...
変更後
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:PrismHandsOn"
xmlns:behaviors="clr-namespace:Prism.Behaviors;assembly=Prism.Forms"
x:Class="PrismHandsOn.Views.MainPage">
<ContentPage.Behaviors>
<behaviors:EventToCommandBehavior EventName="Appearing" Command="{Binding AppearingCommand}"/>
</ContentPage.Behaviors>
...
ContentPageにEventToCommandBehavior
が追記され、EventNameにAppearing
が、CommandにUpdateMessageCommand
が設定されているのが見て取れるでしょう。
それでは実行してみましょう。「Appearing on ~」と表示されれば実装は成功です。