提供一種方式,以執行時物件圖中的相對關係來指定綁定來源。
XAML 屬性使用(自我模式)
<Binding RelativeSource="{RelativeSource Self}" .../>
-or-
<object property="{Binding RelativeSource={RelativeSource Self} ...}" .../>
XAML 屬性的用法(TemplatedParent 模式)
<Binding RelativeSource="{RelativeSource TemplatedParent}" .../>
-or-
<object property="{Binding RelativeSource={RelativeSource TemplatedParent} ...}" .../>
XAML 值
| 字詞 | Description |
|---|---|
| {RelativeSource Self} | 產生值為 Self 的 Mode 值。 目標元素應作為此綁定的來源。 這對於將元素的一個屬性綁定在同一元素上的另一個屬性非常有用。 |
| {RelativeSource TemplatedParent} | 產生一個 ControlTemplate ,作為此綁定的來源。 這對於在範本層級將執行時資訊套用到綁定很有用。 |
Remarks
Binding 可以將 Binding.RelativeSource 設定為 Binding 物件元素的屬性,或是 {Binding} 標記擴充中的元件。 這就是為什麼會顯示兩種不同的 XAML 語法。
RelativeSource 與 {Binding} 標記延伸 類似。 它是一種標記擴充,能夠回傳自身的實例,並支援基於字串的構造,基本上將參數傳給建構子。 此時傳遞的參數為 Mode 值。
Self 模式適合將元素的一個屬性綁定到同一元素上的另一個屬性,這是 ElementName 綁定的變體,但不需要先命名並自我參照該元素。 如果你把一個元素的一個屬性綁定到同一元素的另一個屬性,要嘛屬性必須使用相同的屬性類型,要嘛你也必須在綁定上用 Converter 來轉換這些值。 例如,你可以將 Height 作為 Width 的來源而不經轉換,但若要將 IsEnabled 作為 Visibility 的來源,則需要使用轉換器。
以下為範例。 這個矩形使用 {Binding} 標記擴充,使其高度與寬度始終相等,並呈現為正方形。 只有高度被設定為固定值。 對於這個 矩形 ,它的預設 DataContext 是 空的,不是 這個。 因此,為了將資料內容來源設為物件本身(並啟用對其其他屬性的繫結),我們會在使用 {Binding} 標記延伸時使用 RelativeSource={RelativeSource Self} 引數。
<Rectangle
Fill="Orange" Width="200"
Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}"
/>
另一種用途 RelativeSource={RelativeSource Self} 是將物件的 DataContext 設定為自身。 例如,你可能會在某些 SDK 範例中看到這種技巧,其中 Page 類別已透過自訂屬性加以擴充,而該屬性已提供可直接使用、供其自身資料繫結使用的檢視模型,例如: <common:LayoutAwarePage ... DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}">
註RelativeSource 的 XAML 使用僅顯示其預期用途:在 XAML 中將 Binding.RelativeSource 設定值作為綁定表達式的一部分。 理論上,若設定屬性值為 RelativeSource,則可有其他用途。