繫結宣告概觀

本主題討論可以用來宣告繫結的不同方法。

必要條件

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

這個主題並未涵蓋資料繫結的概念。 如需資料繫結概念的相關討論,請參閱資料繫結概觀

在 XAML 中宣告繫結

本節討論如何在 XAML 中宣告繫結。

標記延伸使用方式

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

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

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

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

物件元素語法

物件元素語法是建立繫結宣告的另一種選擇。 在大部分的情況下,使用標記延伸或物件元素語法並沒有特別的優勢。 但是,若標記延伸無法支援您的案例,例如當屬性值屬於非字串型別,而沒有型別轉換時,則必須使用物件元素語法。

以下為物件元素語法和標記延伸的使用方式範例:

<TextBlock Name="myconvertedtext"
  Foreground="{Binding Path=TheDate,
                       Converter={StaticResource MyConverterReference}}">
  <TextBlock.Text>
    <Binding Path="TheDate"
             Converter="{StaticResource MyConverterReference}"/>
  </TextBlock.Text>
</TextBlock>

此範例會使用延伸模組語法宣告系結, Foreground 以系結 屬性。 屬性的 Text 系結宣告會使用物件專案語法。

如需不同詞彙的詳細資訊,請參閱 XAML 語法詳細資料

MultiBinding 和 PriorityBinding

MultiBindingPriorityBinding 不支援 XAML 擴充功能語法。 因此,如果您要在 MultiBinding XAML 中宣告 或 PriorityBinding ,則必須使用 物件項目語法。

在程式碼中建立繫結

指定系結的另一種方式是直接在程序代碼中的 對象上 Binding 設定屬性。 下列範例示範如何建立 Binding 物件,並在程式代碼中指定屬性。 在此範例中, TheConverter 是實作 IValueConverter 介面的物件。

private void OnPageLoaded(object sender, EventArgs e)
{
    // Make a new source, to grab a new timestamp
    MyData myChangedData = new MyData();

    // Create a new binding
    // TheDate is a property of type DateTime on MyData class
    Binding myNewBindDef = new Binding("TheDate");

    myNewBindDef.Mode = BindingMode.OneWay;
    myNewBindDef.Source = myChangedData;
    myNewBindDef.Converter = TheConverter;
    myNewBindDef.ConverterCulture = new CultureInfo("en-US");

      // myDatetext is a TextBlock object that is the binding target object
    BindingOperations.SetBinding(myDateText, TextBlock.TextProperty, myNewBindDef);
    BindingOperations.SetBinding(myDateText, TextBlock.ForegroundProperty, myNewBindDef);

    lbChooseCulture.SelectedIndex = 0;
}
 Private Sub OnPageLoaded(ByVal sender As Object, ByVal e As EventArgs)
     ' Make a new source, to grab a new timestamp
     Dim myChangedData As New MyData()

     ' Create a new binding
 ' TheDate is a property of type DateTime on MyData class
     Dim myNewBindDef As New Binding("TheDate")

     myNewBindDef.Mode = BindingMode.OneWay
     myNewBindDef.Source = myChangedData
     myNewBindDef.Converter = TheConverter
     myNewBindDef.ConverterCulture = New CultureInfo("en-US")

' myDatetext is a TextBlock object that is the binding target object
     BindingOperations.SetBinding(myDateText, TextBlock.TextProperty, myNewBindDef)
     BindingOperations.SetBinding(myDateText, TextBlock.ForegroundProperty, myNewBindDef)

     lbChooseCulture.SelectedIndex = 0
 End Sub

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

繫結路徑語法

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 標記延伸剖析器特有的反斜杠 \) 字元:

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

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

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

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

預設行為

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

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

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

  • 只要繫結已經有資料內容 (例如繼承的資料內容來自父元素),而且該內容所傳回的任何項目或集合不需要進一步修改路徑即可適用於繫結,繫結宣告可以完全沒有子句:{Binding}。這通常是資料樣式設定指定繫結的方式,其中繫結的作用對象是集合。 如需詳細資訊,請參閱繫結來源概觀中的<使用整個物件做為繫結來源>一節。

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

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

另請參閱