関連付けられたビヘイビアー

Download Sampleサンプルのダウンロード

アタッチされたビヘイビアーは、1 つ以上のプロパティがアタッチされた静的クラスです。 この記事では、アタッチされたビヘイビアーを作成して使用する方法を示します。

概要

添付プロパティは、特殊な種類のバインド可能プロパティです。 1 つのクラスで定義される一方で他のオブジェクトにアタッチされ、XAML 内でピリオドで区切られたクラスとプロパティ名が含まれる属性として認識されます。

添付プロパティでは、プロパティがコントロールに設定されたときなど、プロパティの値が変更されたときに実行される propertyChanged のデリゲートを定義できます。 propertyChanged のデリゲートが実行されると、アタッチされているコントロールへの参照と、プロパティの古い値と新しい値を含むパラメーターが渡されます。 このデリゲートを使用すると、次のように、渡された参照を操作することで、プロパティがアタッチされているコントロールに新しい機能を追加できます。

  1. propertyChanged のデリゲートによって、BindableObject として受け取られるコントロールの参照が、ビヘイビアーが強化されるように設計されたコントロールの種類にキャストされます。
  2. propertyChanged のデリゲートによってコントロールのプロパティ変更、コントロールのメソッド呼び出し、またはコントロールで公開されているイベントに対するイベント ハンドラーの登録が行われ、コア ビヘイビアー機能が実装されます。

アタッチされたビヘイビアーに関する問題は、static プロパティおよびメソッドを使用して static クラスで定義されている点です。 そのため、状態があるアタッチされたビヘイビアーを作成することは困難です。 さらに、ビヘイビアー構築の推奨されるアプローチとして、Xamarin.Forms ビヘイビアーによって、アタッチされたビヘイビアーが置き換えられます。 Xamarin.Forms ビヘイビアーの詳細については、Xamarin.Forms のビヘイビアーに関する記事を参照してください。

アタッチされたビヘイビアーを作成する

サンプル アプリケーションでは、NumericValidationBehavior を示します。ここでは、ユーザーが Entry コントロールに入力した値が double でない場合に、その値を赤色で強調表示します。 このビヘイビアーを次のコード例に示します。

public static class NumericValidationBehavior
{
    public static readonly BindableProperty AttachBehaviorProperty =
        BindableProperty.CreateAttached (
            "AttachBehavior",
            typeof(bool),
            typeof(NumericValidationBehavior),
            false,
            propertyChanged:OnAttachBehaviorChanged);

    public static bool GetAttachBehavior (BindableObject view)
    {
        return (bool)view.GetValue (AttachBehaviorProperty);
    }

    public static void SetAttachBehavior (BindableObject view, bool value)
    {
        view.SetValue (AttachBehaviorProperty, value);
    }

    static void OnAttachBehaviorChanged (BindableObject view, object oldValue, object newValue)
    {
        var entry = view as Entry;
        if (entry == null) {
            return;
        }

        bool attachBehavior = (bool)newValue;
        if (attachBehavior) {
            entry.TextChanged += OnEntryTextChanged;
        } else {
            entry.TextChanged -= OnEntryTextChanged;
        }
    }

    static void OnEntryTextChanged (object sender, TextChangedEventArgs args)
    {
        double result;
        bool isValid = double.TryParse (args.NewTextValue, out result);
        ((Entry)sender).TextColor = isValid ? Color.Default : Color.Red;
    }
}

NumericValidationBehavior クラスには、static getter と setter がある AttachBehavior という名前の添付プロパティが含まれています。このプロパティにより、それがアタッチされるコントロールのビヘイビアーの追加または削除が制御されます。 この添付プロパティは、そのプロパティの値が変更されるときに実行される OnAttachBehaviorChanged デリゲートを登録します。 このメソッドによって、AttachBehavior 添付プロパティの値に基づいて TextChanged イベントのイベント ハンドラーが登録または登録解除されます。 OnEntryTextChanged メソッドにより、ビヘイビアーのコア機能が提供され、ユーザーが Entry に入力した値が解析され、その値が double でなければ TextColor プロパティが赤に設定されます。

アタッチされたビヘイビアーを使用する

NumericValidationBehavior クラスを使用するには、次の XAML コード例に示すように、AttachBehavior 添付プロパティを Entry コントロールに追加します。

<ContentPage ... xmlns:local="clr-namespace:WorkingWithBehaviors;assembly=WorkingWithBehaviors" ...>
    ...
    <Entry Placeholder="Enter a System.Double" local:NumericValidationBehavior.AttachBehavior="true" />
    ...
</ContentPage>

C# での同等の Entry を次のコード例に示します。

var entry = new Entry { Placeholder = "Enter a System.Double" };
NumericValidationBehavior.SetAttachBehavior (entry, true);

実行時、ビヘイビアーは、ビヘイビアーの実装に従って、コントロールとのやりとりに応答します。 次のスクリーン ショットは、無効な入力に応答しているアタッチされたビヘイビアーを示しています。

Sample Application with Attached Behavior

Note

アタッチされたビヘイビアーは特定のコントロールの種類 (または複数のコントロールに適用できるスーパークラス) に対して記述され、互換性のあるコントロールにのみ追加する必要があります。 互換性のないコントロールにビヘイビアーをアタッチしようとすると、不明なビヘイビアーになり、結果はビヘイビアーの実装によって変わります。

アタッチされたビヘイビアーをコントロールから削除する

次の XAML コード例に示すように、NumericValidationBehavior クラスをコントロールから削除するには AttachBehavior 添付プロパティを false に設定します。

<Entry Placeholder="Enter a System.Double" local:NumericValidationBehavior.AttachBehavior="false" />

C# での同等の Entry を次のコード例に示します。

var entry = new Entry { Placeholder = "Enter a System.Double" };
NumericValidationBehavior.SetAttachBehavior (entry, false);

実行時に、AttachBehavior 添付プロパティの値が false に設定されていると、OnAttachBehaviorChanged メソッドが実行されます。 OnAttachBehaviorChanged メソッドによって TextChanged イベントのイベント ハンドラーの登録が解除され、ユーザーがコントロールを操作してもそのビヘイビアーが実行されなくなります。

まとめ

この記事では、アタッチされたビヘイビアーを作成して使用する方法を説明しました。 アタッチされたビヘイビアーは、1 つ以上のアタッチされたプロパティを含む static クラスです。