共用方式為


系結宣告概觀 (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}"/>

上述範例使用的 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

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

如需在 XAML 中建立系結的範例,請參閱 如何建立數據系結

對象專案語法

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

上一節示範如何與 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 的預設值。

另請參閱