SIN@SAPPOROWORKSの覚書

C#を中心に、夜な夜な試行錯誤したコードの記録です。

Xamarin.Forms ビイヘイビア

【 Xamarin 記事一覧 】

Behaviors

Xamarin.Forms 1.3において新しく追加された機能の一つに、ビイヘイビアがありあます。

ビイヘイビアを使用すると、UIコントロールをサブクラス化することなく、そのコントロールに機能を追加することができます。

f:id:furuya02:20150227154055p:plain:w200f:id:furuya02:20150227154057p:plain:w200

 ビヘイビアを実装するには、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;//プロパティ値をセット

    }
}

f:id:furuya02:20150227154124g:plain:w200




【 Xamarin 記事一覧 】