{RelativeSource} 標記擴充

提供一種方式,以執行時物件圖中的相對關係來指定綁定來源。

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} 產生值為 SelfMode 值。 目標元素應作為此綁定的來源。 這對於將元素的一個屬性綁定在同一元素上的另一個屬性非常有用。
{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,則可有其他用途。