繫結宣告概觀
更新:2007 年 11 月
本主題討論可以用來宣告繫結的不同方法。
這個主題包含下列章節。
- 必要條件
- 在 XAML 中宣告繫結
- 在程式碼中建立繫結
- 繫結路徑語法
- 預設行為
- 相關主題
必要條件
在閱讀本主題之前,請務必先熟悉標記延伸的概念和使用方式。如需標記延伸的詳細資訊,請參閱標記延伸和 XAML。
這個主題並未涵蓋資料繫結 (Data Binding) 的概念。如需資料繫結概念的相關討論,請參閱資料繫結概觀。
在 XAML 中宣告繫結
本節討論如何在可延伸標記語言 (XAML) 中宣告繫結。
標記延伸使用方式
Binding 是一種標記延伸。使用繫結延伸宣告繫結時,該宣告是由一系列子句組成,這些子句接在 Binding 關鍵字後面,並以逗號 (,) 分隔。繫結宣告中的子句可以是任何順序,而且有許多可能的組合。這些子包括 Name=Value 配對,其中 Name 是 Binding 屬性的名稱,而 Value 則是您為該屬性設定的值。
在標記中建立繫結宣告字串時,必須將這些字串附加至目標物件的特定相依性屬性。下列範例示範如何使用繫結延伸,藉由指定 Source、Path 和 UpdateSourceTrigger,繫結 TextBox.Text 屬性。
<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 物件並指定屬性。
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);
...
}
如果您要繫結的物件是 FrameworkElement 或 FrameworkContentElement,可以直接在物件上呼叫 SetBinding 方法,而不要使用 BindingOperations.SetBinding。如需範例,請參閱 HOW TO:使用程式碼建立繫結。
繫結路徑語法
請使用 Path 屬性指定您要繫結的來源值:
在最簡單的狀況中,Path 屬性值是用於繫結之來源物件屬性的名稱,例如 Path=PropertyName。
您可以使用 C# 中所用的類似語法,指定屬性的子屬性。例如,子句 Path=ShoppingCart.Order 會將繫結設定為物件或屬性 ShoppingCart 的子屬性 Order。
若要繫結至附加屬性,請在附加屬性前後加上括號。例如,若要繫結至附加屬性DockPanel.Dock,則語法為 Path=(DockPanel.Dock)。
屬性的索引子 (Indexer) 可以在方括弧內指定,接在套用索引子的屬性名稱後面。例如,子句 Path=ShoppingCart[0] 會將繫結設定為索引,而該索引對應於屬性之內部索引處理常值字串 "0" 的方式。此語法也支援巢狀索引子。
Path 子句中可以混合使用索引子和子屬性;例如,Path=ShoppingCart.ShippingInfo[MailingAddress,Street].
您可以在索引子內加入多個以逗號 (,) 分隔的索引子參數。各個參數的型別可以使用括號指定。例如,您可以加入 Path="[(sys:Int32)42,(sys:Int32)24]",其中 sys 對應至 System 命名空間 (Namespace)。
如果來源為集合檢視,就可以使用斜線 (/) 指定目前的項目。例如,子句 Path=/ 會將繫結設定為檢視中目前的項目。如果來源為集合,這個語法就會指定預設集合檢視的目前項目。
屬性名稱和斜線可以組合用來周遊本身為集合的屬性。例如,Path=/Offices/ManagerName 會指定來源集合目前的項目,該集合會包含同樣是集合的 Offices 屬性。它目前的項目為包含 ManagerName 屬性的物件。
或者,可以使用句號 (.) 路徑來繫結至目前的來源。例如,Text=”{Binding}” 等於 Text=”{Binding Path=.}”。
逸出機制
在索引子 ([ ]) 內,插入號 (Caret) 字元 (^) 會逸出下一個子元。
在 XAML 中設定路徑時,您也必須逸出 (使用 XML 實體) XML 剖析器特有的某些字元:
使用 & 逸出 "&" 字元。
使用 > 逸出 ">" 結束標記。
此外,如果您使用標記延伸語法在屬性中描述完整的繫結,您必須逸出 (使用反斜線 \) WPF 標記延伸剖析器特有的字元:
反斜線 (\) 本身是逸出字元。
等號 (=) 分隔屬性名稱和屬性值。
逗號 (,) 分隔屬性。
右大括號 (}) 是標記延伸的結尾。
預設行為
如果宣告中沒有指定,預設行為便如下所述。
建立預設轉換子 (Converter),以嘗試在繫結來源值和繫結目標值之間執行型別轉換。如果無法進行轉換,預設轉換子會傳回 null。
如果您未設定 ConverterCulture,繫結引擎會使用繫結目標物件的 Language 屬性。在 XAML 中,這個值預設為 "en-US",但如果已明確設定,則會繼承頁面之根項目 (或任何項目) 的值。
只要繫結已經有資料內容 (例如繼承的資料內容來自父項目),而且該內容所傳回的任何項目或集合不需要進一步修改路徑即可適用於繫結,繫結宣告可以完全沒有子句:{Binding}。這通常是資料樣式設定指定繫結的方式,其中繫結的作用對象是集合。如需詳細資訊,請參閱繫結來源概觀中的<使用整個物件做為繫結來源>一節。
預設 Mode 會因所繫結之相依性屬性而有單向和雙向的不同。您永遠都可以明確宣告繫結模式,以確保繫結具有所需的行為。一般來說,使用者可編輯的控制項屬性 (例如 TextBox.Text 和 RangeBase.Value) 預設為雙向繫結,而其他屬性大多預設為單向繫結。
預設 UpdateSourceTrigger 值也會因為繫結的相依性屬性而有 PropertyChanged 和 LostFocus 的不同。大部分相依性屬性的預設值是 PropertyChanged,而 TextBox.Text 屬性的預設值為 LostFocus。