[Xamarin][筆記]簡介Behavior

  • 445
  • 0

Behaviors的目的,是要讓我們想要替某個UI物件增加功能時,可以不須透過繼承(subclassing)的方式。它的作法是,將所欲增加的功能實作在一個Behavior class 中,再將它掛在UI物件上,以達到擴增功能的目的。

 

Behavior有兩種:

  • Xamarin.Forms Behaviors
  • Attached Behaviors

Xamarin.Forms Behaviors

建立Xamarin.Forms behavior的步驟如下:

  1. 建立一個繼承BehaviorBehavior<T> class,在這裡 T 就是該Behavior想要套用的Control的型別。
  2. Override OnAttachedTo method 以處理任何必要的Setup
  3. Override OnDetachingFrom method 以處理清理的動作
public class NumericValidationBehavior : Behavior<Entry>
{
    protected override void OnAttachedTo (Entry bindable)
    {
        base.OnAttachedTo (bindable);
        // Perform setup
    }

    protected override void OnDetachingFrom (Entry bindable)
    {
        base.OnDetachingFrom (bindable);
        // Perform clean up
    }

    // Behavior implementation
}

OnAttachedTo method會在該Behavior被掛載到Control時,就被叫用。這個method會取得被掛載的Control的Reference。因此,可以用來在該Control的事件中註冊(register)我們想附加的事件處理功能。

OnDetachingFrom method則會在該Behavior由Control那裡移除時被觸發。這個method也會取得被掛載的Control的Reference,所以也會被用來做清除的工作。

要使用Behavior,作法是將該Behavior掛載在Control的Behaviors collection。

如以下的XAML

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

或是C# Code

var entry = new Entry { Placeholder = "Enter a System.Double" };
entry.Behaviors.Add (new NumericValidationBehavior ());

Attached Behaviors

Attached Behaviors

Attached Behaviors本質上是一種特殊形態的bindable property。它是擁有一個以上的attached properties的static class,透過attached properties掛載到其他的Control上以增加該Control的功能。

attached properties會定義propertyChanged delegate,當property 被設定到control時,或是property變動時,該delegate就會被執行。propertyChanged delegate 會接收到所掛載的control的reference,所以可以修改該control的屬性,掛上Control的事件處理函式。

以下是一個套用在Entry的數字驗證Behavior,會驗證輸入的值如果不為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 class有一個attached property - AttachBehavior,在propertyChanged delegate設定了OnAttachBehaviorChanged method。這在AttachBehavior property 被掛載到Control時會被執行。所以,在OnAttachBehaviorChanged中則針對被掛載的Control(Entry)設定TextChanged Event的處理函式 - OnEntryTextChanged。這樣的行為,就可以為Entry增加了一個數字驗證的功能,而不需透過繼承的方式就可以達到。

使用Attached Behavior

使用方式,就如同一般的attached property一樣,直接在Entry上設定。

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