系結宣告概觀 (WPF .NET)

一般而言,開發人員會直接在想要系結資料之 UI 元素的 XAML 標記中宣告系結。 不過,您也可以在程式碼中宣告系結。 本文說明如何在 XAML 和程式碼中宣告系結。

必要條件

閱讀本文之前,請務必熟悉標記延伸的概念和使用方式。 如需標記延伸的詳細資訊,請參閱標記延伸和 WPF XAML

本文未涵蓋資料系結概念。 如需資料系結概念的討論,請參閱 資料系結概觀

在 XAML 中宣告系結

Binding 是一種標記延伸。 當您使用繫結延伸宣告繫結時,該宣告是由一系列子句組成,這些子句接在 Binding 關鍵字後面,並以逗號 (,) 分隔。 繫結宣告中的子句可以按照任何順序,而且有許多可能的組合。 子句是 Name 值 組,其中 Name = 是屬性的名稱 Binding ,而 Value 是您要為屬性設定的值。

在標記中建立繫結宣告字串時,必須將這些字串附加至目標物件的特定相依性屬性。 下列範例示範如何使用系結延伸模組系結 TextBox.Text 屬性,並 Source 指定 和 Path 屬性。

<TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=Name}"/>

您可以透過這種方式指定 類別的大部分 Binding 屬性。 如需系結延伸模組的詳細資訊,以及無法使用系結延伸模組設定的屬性清單 Binding ,請參閱系 結標記延伸 (.NET Framework) 概觀。

物件專案語法

物件元素語法是建立繫結宣告的另一種選擇。 在大部分情況下,使用標記延伸或物件專案語法並無特殊優勢。 不過,當標記延伸不支援您的案例時,例如,當屬性值為不存在類型轉換的非字串類型時,您需要使用物件專案語法。

上一節示範如何與 XAML 延伸模組系結。 下列範例示範執行相同的系結,但使用物件專案語法:

<TextBlock>
    <TextBlock.Text>
        <Binding Source="{StaticResource myDataSource}" Path="Name"/>
    </TextBlock.Text>
</TextBlock>

如需不同詞彙的詳細資訊,請參閱 XAML 語法詳細資料(.NET Framework)。

MultiBinding 和 PriorityBinding

MultiBindingPriorityBinding 不支援 XAML 擴充功能語法。 這就是為什麼如果您要在 MultiBinding XAML 中宣告 或 PriorityBinding ,則必須使用 物件專案語法。

在程式碼中建立繫結

指定系結的另一種方式是直接在程式碼中的 物件上 Binding 設定屬性,然後將系結指派給 屬性。 下列範例示範如何在程式碼中建立 Binding 物件。

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    // Make a new data source object
    var personDetails = new Person()
    {
        Name = "John",
        Birthdate = DateTime.Parse("2001-02-03")
    };

    // New binding object using the path of 'Name' for whatever source object is used
    var nameBindingObject = new Binding("Name");

    // Configure the binding
    nameBindingObject.Mode = BindingMode.OneWay;
    nameBindingObject.Source = personDetails;
    nameBindingObject.Converter = NameConverter.Instance;
    nameBindingObject.ConverterCulture = new CultureInfo("en-US");

    // Set the binding to a target object. The TextBlock.Name property on the NameBlock UI element
    BindingOperations.SetBinding(NameBlock, TextBlock.TextProperty, nameBindingObject);
}
Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs)

    ' Make a new data source object
    Dim personDetails As New Person() With {
        .Name = "John",
        .Birthdate = Date.Parse("2001-02-03")
    }

    ' New binding object using the path of 'Name' for whatever source object is used
    Dim nameBindingObject As New Binding("Name")

    ' Configure the binding
    nameBindingObject.Mode = BindingMode.OneWay
    nameBindingObject.Source = personDetails
    nameBindingObject.Converter = NameConverter.Instance
    nameBindingObject.ConverterCulture = New CultureInfo("en-US")

    ' Set the binding to a target object. The TextBlock.Name property on the NameBlock UI element
    BindingOperations.SetBinding(NameBlock, TextBlock.TextProperty, nameBindingObject)

End Sub

上述程式碼在系結上設定下列專案:

  • 資料來源物件上屬性的路徑。
  • 系結的模式。
  • 在此案例中,資料來源是代表人員的簡單物件實例。
  • 選擇性轉換程式,在指派給目標屬性之前,先處理從資料來源物件傳入的值。

當您系結的物件是 FrameworkElementFrameworkContentElement 時,您可以直接在 物件上呼叫 SetBinding 方法,而不是使用 BindingOperations.SetBinding 。 如需範例,請參閱 如何:在程式碼 中建立系結。

上述範例使用 的 Person 簡單資料物件類型。 以下是該物件的程式碼:

class Person
{
    public string Name { get; set; }
    public DateTime Birthdate { get; set; }
}
Public Class Person

    Public Property Name As String
    Public Property Birthdate As DateTime
    
End Class

系結路徑語法

Path使用 屬性來指定您想要系結的來源值:

  • 在最簡單的情況下, Path 屬性值是要用於系結之來源物件的屬性名稱,例如 Path=PropertyName

  • 屬性的子屬性可以透過類似 C# 的語法來指定。 例如,子句 Path=ShoppingCart.Order 會將繫結設定為物件或屬性 ShoppingCart 的子屬性 Order

  • 若要繫結至附加屬性,請在附加屬性前後加上括號。 例如,若要系結至附加屬性 DockPanel.Dock ,語法為 Path=(DockPanel.Dock)

  • 屬性的索引子可以在方括弧內指定,接在套用索引子的屬性名稱後面。 例如,子句 Path=ShoppingCart[0] 會將繫結設定為索引,而該索引對應於屬性之內部索引處理常值字串 "0" 的方式。 此語法也支援巢狀索引子。

  • Path 子句中可以混合使用索引子和子屬性;例如,Path=ShoppingCart.ShippingInfo[MailingAddress,Street].

  • 索引子內部。 您可以有多個索引子參數,並以逗號 ( , ) 分隔。 各個參數的型別可以使用括號指定。 例如,您可以加入 Path="[(sys:Int32)42,(sys:Int32)24]",其中 sys 對應至 System 命名空間。

  • 當來源是集合檢視時,可以使用斜線 ( / ) 指定目前的專案。 例如,子句 Path=/ 會將繫結設定為檢視中目前的項目。 如果來源為集合,這個語法就會指定預設集合檢視目前的項目。

  • 屬性名稱和斜線可以組合用來周遊本身為集合的屬性。 例如,Path=/Offices/ManagerName 會指定來源集合目前的項目,其中包含同樣為集合的 Offices 屬性。 其目前項目為包含 ManagerName 屬性的物件。

  • 您可以選擇性地使用句號 ( . ) 路徑系結至目前的來源。 例如,Text="{Binding}" 相當於 Text="{Binding Path=.}"

逸出機制

  • 在索引子內, [ ] 插入號字元 ( ^ ) 會逸出下一個字元。

  • 如果您在 XAML 中設定 Path ,您也需要逸出 (使用 XML 實體) 特定字元,這些字元對 XML 語言定義特別:

    • 使用 &amp; 逸出字元 「 & 」。

    • 使用 &gt; 逸出結束標籤 「 > 」。

  • 此外,如果您使用標記延伸語法在屬性中描述整個系結,則必須逸出 WPF 標記延伸剖析器的特殊字元(使用反斜線 \ )字元:

    • 反斜線 (\) 本身是逸出字元。

    • 等號 (=) 會分隔屬性名稱和屬性值。

    • 逗號 (,) 會分隔屬性。

    • 右大括號 (}) 是標記延伸的結尾。

繫結方向

Binding.Mode使用 屬性來指定系結的方向。 下列模式是系結更新的可用選項:

系結模式 描述
BindingMode.TwoWay 每當目標屬性或來源屬性變更時,更新目標屬性或 屬性。
BindingMode.OneWay 只有在來源屬性變更時,才會更新目標屬性。
BindingMode.OneTime 只有在應用程式啟動時或發生變更時 DataContext ,才會更新目標屬性。
BindingMode.OneWayToSource 當目標屬性變更時,更新來源屬性。
BindingMode.Default 導致使用目標屬性的預設值 Mode

如需詳細資訊,請參閱 BindingMode 列舉。

下列範例示範如何設定 Mode 屬性:

<TextBlock Name="IncomeText" Text="{Binding Path=TotalIncome, Mode=OneTime}" />

若要偵測來源變更 (適用於 OneWayTwoWay 繫結),來源必須實作適當的屬性變更通知機制,例如 INotifyPropertyChanged。 如需詳細資訊,請參閱 提供變更通知

針對 TwoWayOneWayToSource 系結,您可以藉由設定 UpdateSourceTrigger 屬性來控制來源更新的時機。 如需詳細資訊,請參閱UpdateSourceTrigger

預設行為

如果未在宣告中指定,則預設行為如下:

  • 建立預設轉換器,以嘗試在繫結來源值和繫結目標值之間執行型別轉換。 如果無法進行轉換,預設轉換器會傳回 null

  • 如果您未設定 ConverterCulture ,系結引擎會使用 Language 系結目標物件的 屬性。 在 XAML 中,如果已明確設定值,這會預設為 en-US 或繼承頁面的根項目(或任何元素) 的值。

  • 只要系結已經有資料內容(例如,繼承的資料內容來自父元素),而且該內容傳回的任何專案或集合都適合系結,而不需要進一步修改路徑,系結宣告就完全沒有子句: {Binding} 。 這通常是針對資料樣式指定系結的方式,其中系結會在集合上運作。 如需詳細資訊,請參閱 使用整個物件作為系結來源

  • 根據所系結的相依性屬性,預設值 Mode 會因單向和雙向而有所不同。 您永遠都可以明確宣告繫結模式,以確保繫結具有所需的行為。 一般而言,使用者可編輯的控制項屬性,例如 TextBox.TextRangeBase.Value ,預設為雙向系結,但大部分的其他屬性預設為單向系結。

  • 預設值 UpdateSourceTrigger 也會根據系結相依性屬性而有所不同 PropertyChangedLostFocus 。 大多數相依性屬性的預設值為 PropertyChanged,而 TextBox.Text 屬性具有 LostFocus 的預設值。

另請參閱