本主題討論聲明綁定的不同方法
先決條件
在閱讀本主題之前應當先熟悉標記擴展的概念和使用這一點非常重要
本主題不介紹數據綁定的概念
在 XAML 中聲明綁定
本節討論如何在可擴展應用程序標記語言 (XAML) 中聲明綁定
標記擴展使用
Binding 是標記擴展當您使用綁定擴展來聲明綁定時聲明包含一系列子句這些子句跟在 Binding 關鍵字後面並由逗號 () 分隔綁定聲明中的子句可以按任意順序排列因此有許多可能的組合子句是名稱=值 對其中名稱 是 Binding 屬性值 是您要為該屬性設置的值
當在標記中創建綁定聲明字符串時必須將它們附加到目標對象的特定依賴項屬性下面的示例演示如何通過使用綁定擴展並指定 SourcePath 和 UpdateSourceTrigger 屬性來綁定 TextBoxText 屬性
您可以通過這種方法來指定 Binding 類的大部分屬性
對象元素語法
對象元素語法是創建綁定聲明的另一種方法在大多數情況下使用標記擴展或對象元素語法沒有特定的優勢但是在標記擴展不支持您的方案的情況下例如當您的屬性值是不存在類型轉換的非字符串類型時您將需要使用對象元素語法
下面是對象元素語法和標記擴展使用的一個示例
此示例通過使用擴展語法聲明綁定來綁定 Foreground 屬性Text 屬性的綁定聲明使用對象元素語法
MultiBinding 和 PriorityBinding
MultiBinding 和 PriorityBinding 不支持 XAML 擴展語法因此如果您要在 XAML 中聲明 MultiBinding 或 PriorityBinding則必須使用對象元素語法
在代碼中創建綁定
指定綁定的另一種方法是在代碼中直接為 Binding 對象設置屬性下面的示例演示如何在代碼中創建 Binding 對象並指定屬性
如果您要綁定的對象是 FrameworkElement 或 FrameworkContentElement則您可以直接對該對象調用 SetBinding 方法而不是使用 BindingOperations::SetBinding
綁定路徑語法
使用 Path 屬性可以指定您要綁定到的源值
在最簡單的情況下Path 屬性值是要用於綁定的源對象的屬性名如 Path=PropertyName
在 C# 中可以通過類似語法指定屬性的子屬性例如子句 Path=ShoppingCartOrder 設置與對象或屬性 ShoppingCart 的 Order 子屬性的綁定
若要綁定到附加屬性應在附加屬性周圍放置圓括號例如若要綁定到附加屬性 DockPanel::Dock則語法是 Path=(DockPanelDock)
可以在要應用索引器的屬性名後面的方括號內指定屬性的索引器例如子句 Path=ShoppingCart[] 將綁定設置為與屬性的內部索引處理文本字符串的方式對應的索引還支持嵌套的索引器
可以在 Path 子句中混合索引器和子屬性例如Path=ShoppingCartShippingInfo[MailingAddressStreet]
在索引器內部您可以有多個由逗號 () 分隔的索引器參數可以使用圓括號指定每個參數的類型
例如您可以有 Path=[(sys:Int)(sys:Int)]其中 sys 映射到 System 命名空間
轉義機制
在索引器 ([ ]) 內部插入符號 (^) 用於對下一個字符進行轉義
如果您在 XAML 中設置 Path則還需要使用 XML 實體對 XML 分析程序專用的某些字符進行轉義
使用 & 對字符&進行轉義
使用 > 對結束標記>進行轉義
此外如果您使用標記擴展語法描述屬性中的整個綁定則需要使用反斜槓 \ 對 WPF 標記擴展分析程序專用的字符進行轉義
反斜槓 \ 本身是轉義字符
等號 (=) 將屬性名與屬性值隔開
逗號 () 用於分隔屬性
右大括號 (}) 是標記擴展的結尾
默認行為
如果未在聲明中指定默認行為則默認行為如下
創建一個嘗試在綁定源值與綁定目標值之間執行類型轉換的默認轉換器如果無法進行轉換則默認轉換器會返回 null
如果您不設置 ConverterCulture則綁定引擎會使用綁定目標對象的 Language 屬性在 XAML 中此屬性默認為enUS或者從頁面的根元素(或任何元素)繼承值(如果已顯式設置了一個值)
只要綁定已有數據上下文(例如來自父元素的繼承數據上下文)並且該上下文所返回的項或集合適合於綁定而不需要進一步的路徑修改則綁定聲明可以不必有任何子句{Binding}在綁定作用於集合的情況下這通常是為數據樣式指定綁定的方式
默認 Mode 可能是單向也可能是雙向具體取決於所綁定的依賴項屬性您始終可以顯式聲明綁定模式以確保綁定具有所需的行為通常用戶可編輯的控件屬性(如 TextBox::Text 和 RangeBase::Value)默認為雙向綁定而其他大多數屬性默認為單向綁定
默認 UpdateSourceTrigger 值可能是 PropertyChanged也可能是 LostFocus具體也取決於所綁定的依賴項屬性多數依賴項屬性的默認值都為 PropertyChanged而 TextBox::Text 屬性的默認值為 LostFocus
From:http://tw.wingwit.com/Article/program/net/201311/11697.html