繫結宣告概觀
本主題討論可以用來宣告繫結的不同方法。
必要條件
在閱讀本主題之前,請務必先熟悉標記延伸的概念和使用方式。 如需標記延伸的詳細資訊,請參閱標記延伸和 WPF XAML。
這個主題並未涵蓋資料繫結的概念。 如需資料繫結概念的相關討論,請參閱資料繫結概觀。
在 XAML 中宣告繫結
本節討論如何在 XAML 中宣告繫結。
標記延伸使用方式
Binding 是一種標記延伸。 當您使用繫結延伸宣告繫結時,該宣告是由一系列子句組成,這些子句接在 Binding
關鍵字後面,並以逗號 (,) 分隔。 繫結宣告中的子句可以按照任何順序,而且有許多可能的組合。 這些子句是 Name=Value 配對,其中 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
MultiBinding 和 PriorityBinding 不支援 XAML 延伸語法。 因此,如果您要在 XAML 中宣告 MultiBinding 或 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
如果您要繫結的物件是 FrameworkElement 或 FrameworkContentElement,您可直接在物件上呼叫 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 語言定義特有的某些字元:
使用
&
逸出 "&" 字元。使用
>
逸出結尾標記 「>」。
此外,如果您使用標記延伸語法在屬性中描述完整的繫結,您必須逸出 (使用反斜線 \) WPF 標記延伸剖析器特有的字元:
反斜線 (\) 本身是逸出字元。
等號 (=) 會分隔屬性名稱和屬性值。
逗號 (,) 會分隔屬性。
右大括號 (}) 是標記延伸的結尾。
預設行為
如果宣告中未指定,則預設行為如下。
建立預設轉換器,以嘗試在繫結來源值和繫結目標值之間執行型別轉換。 如果無法進行轉換,預設轉換器會傳回
null
。如果您未設定 ConverterCulture,繫結引擎會使用繫結目標物件的
Language
屬性。 在 XAML 中,這個值預設為 "en-US",但如果已明確設定,則會繼承頁面之根元素 (或任何元素) 的值。只要繫結已經有資料內容 (例如繼承的資料內容來自父元素),而且該內容所傳回的任何項目或集合不需要進一步修改路徑即可適用於繫結,繫結宣告可以完全沒有子句:
{Binding}
。這通常是資料樣式設定指定繫結的方式,其中繫結的作用對象是集合。 如需詳細資訊,請參閱繫結來源概觀中的<使用整個物件做為繫結來源>一節。根據所繫結的相依性屬性,預設 Mode 在單向和雙向之間有所不同。 您永遠都可以明確宣告繫結模式,以確保繫結具有所需的行為。 一般而言,使用者可以編輯的控制項屬性,例如 TextBox.Text 和 RangeBase.Value,預設為雙向繫結,而其他大多數屬性則預設為單向繫結。
根據繫結相依性屬性,PropertyChanged 與 LostFocus 之間的預設 UpdateSourceTrigger 值也會不同。 大多數相依性屬性的預設值為 PropertyChanged,而 TextBox.Text 屬性具有 LostFocus 的預設值。