Behaviors的目的,是要讓我們想要替某個UI物件增加功能時,可以不須透過繼承(subclassing)的方式。它的作法是,將所欲增加的功能實作在一個Behavior class 中,再將它掛在UI物件上,以達到擴增功能的目的。
Behavior有兩種:
- Xamarin.Forms Behaviors
- Attached Behaviors
Xamarin.Forms Behaviors
建立Xamarin.Forms behavior的步驟如下:
- 建立一個繼承
Behavior
或Behavior<T>
class,在這裡T
就是該Behavior想要套用的Control的型別。 - Override
OnAttachedTo
method 以處理任何必要的Setup - 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>