附加的行為

Download Sample 下載範例

附加的行為是具有一或多個附加屬性的靜態類別。 本文示範如何建立和使用附加的行為。

概觀

附加屬性是可繫結屬性的特殊類型。 它們會定義於一個類別但附加至其他物件,而且在 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 類別包含名為 AttachBehavior 並具有 static getter 和 setter 的附加屬性,其控制所要附加之控制項的行為新增與移除。 此附加屬性會註冊 OnAttachBehaviorChanged 方法;當屬性的值變更時,就會執行此方法。 此方法會根據 AttachBehavior 附加屬性的值,註冊或取消註冊 TextChanged 事件的事件處理常式。 行為的核心功能是由 OnEntryTextChanged 方法所提供,它會剖析使用者輸入 Entry 的值,並將 TextColor 屬性設定為紅色 (如果值不是 double)。

使用附加的行為

您可以將 AttachBehavior 附加屬性新增至 Entry 控制項來使用 NumericValidationBehavior 類別,如下列 XAML 程式碼範例所示:

<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

注意

附加的行為是針對特定控制項類型 (或可套用至許多控制項的子類別) 所撰寫,而且只應新增至相容的控制項。 嘗試將行為附加至不相容的控制項會導致行為不明,並會取決於行為實作。

從控制項中移除附加的行為

您可以將 AttachBehavior 附加屬性設定為 false,從控制項中移除 NumericValidationBehavior 類別,如下列 XAML 程式碼範例所示:

<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 事件的事件處理常式,以確保當使用者與控制項互動時不會執行此行為。

摘要

本文示範了如何建立和使用附加的行為。 附加行為是具有一或多個附加屬性的 static 類別。