BindableObject 類別

定義

提供一個機制,應用程式開發人員可以利用此機制,透過啟用驗證、類型強制型轉和事件系統,將某個物件中的資料變更傳播到另一個物件。 BindableProperty.

public abstract class BindableObject : System.ComponentModel.INotifyPropertyChanged, Xamarin.Forms.Internals.IDynamicResourceHandler
type BindableObject = class
    interface INotifyPropertyChanged
    interface IDynamicResourceHandler
繼承
BindableObject
衍生
實作

備註

BindableObject類別提供資料儲存機制,可讓應用程式開發人員在物件之間同步處理資料,以回應變更,例如,在 MVVM 設計模式中的 view 和 View 模型之間的變更。 命名空間中的所有視覺元素 Xamarin.Forms 都會繼承自 BindableObject 類別,因此它們全都可以用來系結其使用者介面元素後方的資料,以查看應用程式開發人員所提供的模型。

若要將屬性中的資料 BindableObject (通常是視圖)系結至視圖模型中的屬性,應用程式開發人員應該執行下列動作。

首先,開發人員在此視圖上建立一組屬性,其中一個是 BindableProperty ,而另一個則是所需的任何類型的屬性。 在下列程式碼中, MockBindableObject 會指出通常是實際執行程式碼中的使用者介面物件。 應用程式開發人員應該注意使用 SetValue(BindableProperty, Object)GetValue(BindableProperty) 來取得和設定系結屬性的值;所需類型的屬性會提供系結屬性的目標將執行的介面。

class MockBindableObject : BindableObject
{
    // App developers should use the method below in production code for 
    // better performance
    public static readonly BindableProperty BoundNameProperty =
         BindableProperty.Create ("Foo", typeof (string),
                                  typeof (MockBindableObject),
                                  default(string));

    // App developers should use the method below during development for
    // design-time error checking as the codebase evolves.
    // public static readonly BindableProperty FooProperty 
    //     = BindableProperty.Create<MockBindableObject, string> (
    //         o => o.Foo, default (string)
    //     );

    public string BoundName
    {
        get { return (string) GetValue (BoundNameProperty); }
        set { SetValue (BoundNameProperty, value); }
    }
}

其次,開發人員會在實介面的類別中建立系結屬性的實作為 INotifyPropertyChanged 。 在 MVVM 設計模式中,這通常是由視圖模型所完成。 應用程式開發人員應該 INotifyPropertyChanged 在要用來作為視圖模型的類別上執行介面。 在下列範例中,應用程式開發人員應該記下 Name 屬性實作為的慣用方式,先確定屬性確實變更,如果沒有,則會傳回,然後只指派值並呼叫 OnPropertyChanged(String) 方法。 此外,下列範例中的 名稱 屬性只會包裝 名稱 欄位。 在實務上,應用程式開發人員可以選擇用來儲存應用程式資料的不同模型。

class MockViewModel : INotifyPropertyChanged
{
    string name;

    public string Name
    {
        get { return name; }
        set
        {
            // OnPropertyChanged should not be called if the property value
            // does not change.
            if (name == value)
                return;
            name = value;
            OnPropertyChanged ();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    void OnPropertyChanged (string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler (this, new PropertyChangedEventArgs (propertyName));
    }
}

第三,最後,應用程式開發人員會將 BindableObject 的實例系結至執行 INotifyPropertyChanged 的實例。 在 MVVM 設計模式的詞彙中,這就是「將視圖的實例系結至視圖模型的實例」。 完成此步驟之後,資料中的變更就會以在系結 BindingMode 步驟期間傳遞的列舉值(如果有的話)的方式,于 view 和 View 模型之間傳播。

下列程式碼包含在參考上述類別的專案中時,會建立 MockBindableMockViewModel的實例、執行一些 intitialization、設定系結,然後示範單向系結。 下列程式碼會在不擲回例外狀況的情況下執行。

public static void OneWayDemo ()
{
    var view = new MockBindableObject ();
    var viewModel = new MockViewModel ();

    // Pre-load the ViewModel, for demonstration purposes
    viewModel.Name = "Testing";

    // Create a one-way (default) binding
    view.SetBinding (MockBindableObject.BoundNameProperty, new Binding ("Name"));

    // App developers should only set the binding context after all
    // calls to SetBinding() have been made, for performance reasons.
    view.BindingContext = viewModel;

    // In a one way binding, the ViewModel value will be used to update
    // the values in the View during initialization
    if (view.BoundName != "Testing")
        throw new Exception ();

    view.BoundName = "gnitseT";

    // in a one way binding, changes to the View will NOT update the ViewModel
    if (viewModel.Name == "gnitseT")
        throw new Exception ();
}

建構函式

BindableObject()

初始化 BindableObject 類別的新執行個體。

欄位

BindingContextProperty

實作其介面是由 BindingContext 屬性提供的繫結屬性。

屬性

BindingContext

取得或設定物件,這個物件包含屬於此 BindableObject 屬性繫結屬性將設為目標的屬性。

Dispatcher

方法

ApplyBindings()

將繫結套用至 BindingContext

ClearValue(BindableProperty)

清除 SetValue 針對 property 所設定的任何值。

ClearValue(BindablePropertyKey)

清除 SetValue 針對 propertyKey 所識別屬性設定的任何值。

CoerceValue(BindableProperty)
CoerceValue(BindablePropertyKey)
GetValue(BindableProperty)

傳回 BindableProperty 中包含的值。

GetValues(BindableProperty, BindableProperty)
已過時。

供 Xamarin.Forms 平台內部使用。

GetValues(BindableProperty, BindableProperty, BindableProperty)
已過時。

供 Xamarin.Forms 平台內部使用。

IsSet(BindableProperty)

如果目標屬性存在且已設定,則傳回 true

OnBindingContextChanged()

覆寫此方法,以在 BindingContext 變更時執行動作。

OnPropertyChanged(String)

從子類別呼叫這個方法,以通知屬性發生了變更。

OnPropertyChanging(String)

從子類別呼叫這個方法,以通知屬性即將發生變更。

RemoveBinding(BindableProperty)

移除先前設定的繫結。

SetBinding(BindableProperty, BindingBase)

將繫結指派給屬性。

SetInheritedBindingContext(BindableObject, Object)

設定巢狀項目的繼承內容。

SetValue(BindableProperty, Object)

設定指定之屬性的值。

SetValue(BindablePropertyKey, Object)

設定 propertyKey 的值。

SetValueCore(BindableProperty, Object, SetValueFlags)

供 Xamarin.Forms 平台內部使用。

UnapplyBindings()

取消套用所有先前設定的繫結。

事件

BindingContextChanged

每當 BindingContext 屬性變更時引發。

PropertyChanged

在屬性變更時引發。

PropertyChanging

在屬性即將變更時引發。

明確介面實作

IDynamicResourceHandler.SetDynamicResource(BindableProperty, String)

供 Xamarin.Forms 平台內部使用。

擴充方法

GetPropertyIfSet<T>(BindableObject, BindableProperty, T)
SetAppThemeColor(BindableObject, BindableProperty, Color, Color)
SetBinding(BindableObject, BindableProperty, String, BindingMode, IValueConverter, String)

建立並將繫結套用至屬性。

SetBinding<TSource>(BindableObject, BindableProperty, Expression<Func<TSource,Object>>, BindingMode, IValueConverter, String)
已過時。

從運算式建立及套用繫結。

SetOnAppTheme<T>(BindableObject, BindableProperty, T, T)

適用於