系結宣告概觀 (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
MultiBinding 和 PriorityBinding 不支援 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
上述程式碼在系結上設定下列專案:
- 資料來源物件上屬性的路徑。
- 系結的模式。
- 在此案例中,資料來源是代表人員的簡單物件實例。
- 選擇性轉換程式,在指派給目標屬性之前,先處理從資料來源物件傳入的值。
當您系結的物件是 FrameworkElement 或 FrameworkContentElement 時,您可以直接在 物件上呼叫 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 語言定義特別:
使用
&
逸出字元 「&
」。使用
>
逸出結束標籤 「>
」。
此外,如果您使用標記延伸語法在屬性中描述整個系結,則必須逸出 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}" />
若要偵測來源變更 (適用於 OneWay 和 TwoWay 繫結),來源必須實作適當的屬性變更通知機制,例如 INotifyPropertyChanged。 如需詳細資訊,請參閱 提供變更通知 。
針對 TwoWay 或 OneWayToSource 系結,您可以藉由設定 UpdateSourceTrigger 屬性來控制來源更新的時機。 如需詳細資訊,請參閱UpdateSourceTrigger。
預設行為
如果未在宣告中指定,則預設行為如下:
建立預設轉換器,以嘗試在繫結來源值和繫結目標值之間執行型別轉換。 如果無法進行轉換,預設轉換器會傳回
null
。如果您未設定 ConverterCulture ,系結引擎會使用
Language
系結目標物件的 屬性。 在 XAML 中,如果已明確設定值,這會預設為en-US
或繼承頁面的根項目(或任何元素) 的值。只要系結已經有資料內容(例如,繼承的資料內容來自父元素),而且該內容傳回的任何專案或集合都適合系結,而不需要進一步修改路徑,系結宣告就完全沒有子句:
{Binding}
。 這通常是針對資料樣式指定系結的方式,其中系結會在集合上運作。 如需詳細資訊,請參閱 使用整個物件作為系結來源 。根據所系結的相依性屬性,預設值 Mode 會因單向和雙向而有所不同。 您永遠都可以明確宣告繫結模式,以確保繫結具有所需的行為。 一般而言,使用者可編輯的控制項屬性,例如 TextBox.Text 和 RangeBase.Value ,預設為雙向系結,但大部分的其他屬性預設為單向系結。
預設值 UpdateSourceTrigger 也會根據系結相依性屬性而有所不同 PropertyChangedLostFocus 。 大多數相依性屬性的預設值為 PropertyChanged,而 TextBox.Text 屬性具有 LostFocus 的預設值。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應