天天看點

第十六章:資料綁定(二)Code和XAML

Code和XAML

雖然大多數資料綁定都是在XAML中定義的,但您應該知道如何在代碼中執行一個。 這是在代碼中設定資料綁定的一種方式(但不是唯一的方法):

  • 在目标對象上設定BindingContext屬性以引用源對象。
  • 在目标對象上調用SetBinding以指定目标和源屬性。

BindingContext屬性由BindableObject定義。 (它是BindableObject定義的唯一屬性。)SetBinding方法也由BindableObject定義,但BindableObjectExtensions類中的SetBinding方法還有兩個額外的重載。 target屬性被指定為BindableProperty; source屬性通常指定為字元串。

OpacityBindingCode程式建立兩個元素,Label和Slider,并定義一個資料綁定,該綁定以Slider的Value屬性為目标的Label的Opacity屬性:

public class OpacityBindingCodePage : ContentPage
{
    public OpacityBindingCodePage()
    {
        Label label = new Label
        {
            Text = "Opacity Binding Demo",
            FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label)),
            VerticalOptions = LayoutOptions.CenterAndExpand,
            HorizontalOptions = LayoutOptions.Center
        };
        Slider slider = new Slider
        {
            VerticalOptions = LayoutOptions.CenterAndExpand
        };
        // Set the binding context: target is Label; source is Slider. 
        label.BindingContext = slider;
        // Bind the properties: target is Opacity; source is Value.
        label.SetBinding(Label.OpacityProperty, "Value");
        // Construct the page.
        Padding = new Thickness(10, 0);
        Content = new StackLayout
        {
            Children = { label, slider }
        };
    }
}           

這是連接配接兩個對象的屬性設定:

label.BindingContext = slider;           

标簽對象是目标,滑塊對象是源。這是連結兩個屬性的方法調用:

label.SetBinding(Label.OpacityProperty, "Value");           

SetBinding的第一個參數是BindableProperty類型,這是target屬性的要求。 但source屬性僅指定為字元串。 它可以是任何類型的财産。

螢幕截圖示範了您不需要設定事件處理程式來使用Slider來控制頁面上的其他元素:

第十六章:資料綁定(二)Code和XAML

當然,有人正在設定一個事件處理程式。 在封面下,當綁定初始化自身時,它還通過從Slider的Value屬性設定Label的Opacity屬性來對目标執行初始化。 (正如您在上一章中發現的那樣,當您自己設定事件處理程式時,此初始化不會自動發生。)然後内部綁定代碼檢查源對象(在本例中為Slider)是否實作了INotifyPropertyChanged接口。 如果是這樣,則在Slider上設定PropertyChanged處理程式。 每當Value屬性更改時,綁定都會将新值設定為Label的Opacity屬性。

在XAML中重制綁定涉及兩個您尚未看到的标記擴充:

  • x:Reference,是XAML 2009規範的一部分。
  • Binding,它是Microsoft基于XAML的使用者界面的一部分。

x:Reference綁定擴充非常簡單,但Binding标記擴充是所有Xamarin.Forms中最廣泛和最複雜的标記擴充。 它将在本章的過程中逐漸介紹。

以下是在XAML中設定資料綁定的方法:

  • 将目标元素(Label)的BindingContext屬性設定為引用源元素(Slider)的x:Reference标記擴充。
  • 将target屬性(Label的Opacity屬性)設定為引用source屬性的Binding标記擴充(Slider的Value屬性)。

OpacityBindingXaml項目顯示完整的标記:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="OpacityBindingXaml.OpacityBindingXamlPage"
             Padding="10, 0">
    <StackLayout>
        <Label Text="Opacity Binding Demo"
               FontSize="Large"
               VerticalOptions="CenterAndExpand"
               HorizontalOptions="Center"
               BindingContext="{x:Reference Name=slider}"
               Opacity="{Binding Path=Value}" />
        <Slider x:Name="slider"
                VerticalOptions="CenterAndExpand" />
    </StackLayout> 
</ContentPage>           

綁定的兩個标記擴充是Label中的最後兩個屬性設定。 除了對InitializeComponent的标準調用之外,代碼隐藏檔案不包含任何内容。

在标記中設定BindingContext時,很容易忘記x:Reference标記擴充并簡單地指定源名稱,但這不起作用。

Binding标記表達式的Path參數指定source屬性。 為什麼這個論點叫做Path而不是Property? 你會在本章後面看到原因。

您可以将标記縮短一點。 為Reference提供支援的公共類是ReferenceExtension,它将其content屬性定義為Name。 BindingExtension(不是公共類)的content屬性是Path,是以您不需要Name和Path參數以及等号:

<Label Text="Opacity Binding Demo"
       FontSize="Large"
       VerticalOptions="CenterAndExpand"
       HorizontalOptions="Center"
       BindingContext="{x:Reference slider}"
       Opacity="{Binding Value}" />           

或者,如果您想使标記更長,可以将BindingContext和Opacity屬性作為屬性元素分解,并使用x的正常元素文法設定它們:引用和綁定:

<Label Text="Opacity Binding Demo"
       FontSize="Large"
       VerticalOptions="CenterAndExpand"
       HorizontalOptions="Center">
 
    <Label.BindingContext>
        <x:Reference Name="slider" />
    </Label.BindingContext>
 
    <Label.Opacity>
        <Binding Path="Value" />
    </Label.Opacity>
</Label>           

正如您将看到的,對于綁定,使用屬性元素有時與資料綁定相關。

繼續閱讀