Xamarin.Forms ビイヘイビア
Behaviors
Xamarin.Forms 1.3において新しく追加された機能の一つに、ビイヘイビアがありあます。ビイヘイビアを使用すると、UIコントロールをサブクラス化することなく、そのコントロールに機能を追加することができます。
ビヘイビアを実装するには、Behaviorクラスを継承した独自のビヘイビアクラスを定義します。この時、Behaviorクラスには対象とするUIコントロール(ここではEntry)の型を指定します。
ビヘイビアクラスの中では、OnAttachedTo及びOnDetachingFromをオーバーライドし、そこで、追加する機能メソッド(サンプルではCheckEmail)を追加・削除するだけです。
最後に、このビヘイビアクラス(EmailBehavior)を、対象となるEntryのBehaviorsプロパティに追加しています。
public class App : Application{ public App(){ MainPage = new MyPage(); } //・・・省略・・・ } class MyPage : ContentPage{ public MyPage(){ var button = new Button{ Text = "Send", }; var entry = new Entry{ WidthRequest = 200, Placeholder = "user@exsample.com", Behaviors = { new EmailBehavior() }//ビヘイビアの追加 }; Content = new StackLayout{ Padding = 50, Children = { entry, button } }; } } public class EmailBehavior : Behavior<Entry> { private readonly Regex _regex = new Regex(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"); protected override void OnAttachedTo(Entry bindable) { //ハンドラの追加 bindable.TextChanged += CheckEmail; } protected override void OnDetachingFrom(Entry bindable) { //ハンドラの削除 bindable.TextChanged -= CheckEmail; } private void CheckEmail(object sender, TextChangedEventArgs e) { //文字列がEmailとして正しいかどうかのチェック var m = _regex.Match(e.NewTextValue); //正かどうかによってテキストの色を変化させる ((Entry) sender).TextColor = m.Success ? Color.Default : Color.Red; } }
別コントロールとの連携
ビヘイビアクラスでの挙動追加は、対象コントロールに閉じた動作になります。
追加機能(ここでは検証結果)を別のコントロール(ここではSendボタン)に連動させるには、ビヘイビアクラス側で、外部に状態を伝える何かが必要です。
次のコードは、ビヘイビアクラスにIsValidというプロパティを追加して、それにより、Sendボタンの有効無効を制御しています。
//・・・省略・・・ class MyPage : ContentPage { public MyPage() { var button = new Button { Text = "Send", IsEnabled = false //デフォルトで無効にした }; //ビヘイビアクラスを変数として保持した var emailBehavior = new EmailBehavior(); var entry = new Entry { WidthRequest = 200, Placeholder = "user@exsample.com", Behaviors = {emailBehavior} }; entry.TextChanged += (sender, args) => { button.IsEnabled = emailBehavior.IsValid; //ビヘイビアクラスの検証結果を使用してボタンを状態を変更する }; //・・・省略・・・ } } public class EmailBehavior : Behavior<Entry> { //クラス外から検証結果が分かるようにプロパティを追加 public bool IsValid { get; private set; } //・・・省略・・・ private void CheckEmail(object sender, TextChangedEventArgs e) { //文字列がEmailとして正しいかどうかのチェック var m = _regex.Match(e.NewTextValue); //正かどうかによってテキストの色を変化させる ((Entry) sender).TextColor = m.Success ? Color.Default : Color.Red; IsValid = m.Success;//プロパティ値をセット } }