RelativeSource 標記延伸
指定 RelativeSource 繫結來源的屬性,以在 繫結標記延伸 內使用,或當設定 XAML 中所建立 Binding 項目的 RelativeSource 屬性時使用。
XAML 屬性使用方式
<Binding RelativeSource="{RelativeSource modeEnumValue}" .../>
XAML 屬性使用方式 (以巢狀方式置於 Binding 延伸內)
<object property="{Binding RelativeSource={RelativeSource modeEnumValue} ...}" .../>
XAML 物件項目使用方式
<Binding>
<Binding.RelativeSource>
<RelativeSource Mode="modeEnumValue"/>
</Binding.RelativeSource>
</Binding>
- or
<Binding>
<Binding.RelativeSource>
<RelativeSource
Mode="FindAncestor"
AncestorType="{x:Type typeName}"
AncestorLevel="intLevel"
/>
</Binding.RelativeSource>
</Binding>
XAML 值
modeEnumValue |
下列其中一項:
|
FindAncestor |
字串語彙基元 FindAncestor。 使用此語彙基元可進入某個模式,讓 RelativeSource 指定祖系型別以及選擇性指定祖系層級。 這相當於 RelativeSource 建立時將其 Mode 屬性設為 FindAncestor。 |
typeName |
FindAncestor 模式的必要項。 填入 AncestorType 屬性的型別名稱。 |
intLevel |
FindAncestor 模式的選擇項。 祖系層級 (朝邏輯樹狀結構的父項目方向評估)。 |
備註
{RelativeSource TemplatedParent}繫結使用方式是一項重要技術,能夠處理區分控制項 UI 及控制項邏輯的大概念。 這允許從範本定義範圍內繫結到樣板化父代 (套用該範本的執行階段物件執行個體)。 這種情況下,TemplateBinding 標記延伸其實是下列繫結運算式的簡寫:{Binding RelativeSource={RelativeSource TemplatedParent}}。 TemplateBinding或{RelativeSource TemplatedParent} 使用方式都只在定義範本的 XAML 中相關。 如需詳細資訊,請參閱 TemplateBinding 標記延伸
{RelativeSource FindAncestor}主要用於在控制項範本或可預測的獨立使用者介面組成,其中特定組系類型的視覺化樹狀結構一律需要控制項。 例如,專案控制項的項目可能使用FindAncestor使用方法繫結期項目控制項父代的屬性。 或者,範本中屬於控制項組成的項目可以使用FindAncestor 繫結至同一個組成結構中的父代元素。
在<XAML 語法>章節內顯示之 FindAncestor 模式的物件項目語法中,FindAncestor 模式特別使用了第二種物件項目語法。 FindAncestor 模式需要 AncestorType 值。 您必須使用要尋找之祖系型別的 x:Type 標記延伸參考,將 AncestorType 設為屬性。 當繫結要求在執行階段處理時,會使用 AncestorType 值。
對於 FindAncestor 模式來說,當項目樹狀結構可能有超過一個祖系屬於該型別時,選擇性屬性 AncestorLevel 將有助於釐清祖系查閱。
如需關於如何使用FindAncestor模式的詳細資訊,請參閱RelativeSource.
{RelativeSource Self} 適用於執行個體的其中一個屬性依賴於同一個執行個體另一個屬性的值,且兩個屬性之間並沒有一般性的相依性屬性關係 (例如強制型轉)。 雖然物件中的兩個屬性很少有一樣的值 (且相同類型),但您也可以套用 Converter 參數至含有 {RelativeSource Self} 的繫結,並且使用轉換子轉換來源和目標類型。 另一種 {RelativeSource Self} 的情況是 MultiDataTrigger 的一部分。
例如,下列 XAML 會定義 Rectangle 項目,使得無論對 Width 輸入的值為何,Rectangle 永遠都是正方形:<Rectangle Width="200" Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}" .../>
{RelativeSource PreviousData}適用於資料範本或使用集合的繫結。 您可以使用 {RelativeSource PreviousData} 反白顯示集合中相鄰資料項目的關聯性。 相關的技術是為資料來源中目前和先前的項目之間建立MultiBinding,並且於該繫結使用轉換器探定兩個項目及其屬性之間的不同。
下列範例中,項目範本中的第一個 TextBlock 會顯示目前的號碼。 第二個 TextBlock 繫結是MultiBinding,這名義上會有兩個 Binding 組成部分:目前記錄,以及特意透過 {RelativeSource PreviousData} 使用上一筆資料記錄的繫結。 然後,MultiBinding 上的轉換器會計算差異,並將它傳回給繫結。
<ListBox Name="fibolist">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding}"/>
<TextBlock>, difference = </TextBlock>
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource DiffConverter}">
<Binding/>
<Binding RelativeSource="{RelativeSource PreviousData}"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
這裡將不說明資料繫結的概念,另請參閱資料繫結概觀。
在 WPF XAML 處理器實作中,這個標記延伸的處理是由 RelativeSource 類別定義。
RelativeSource 是一種標記延伸。 如果必須將屬性 (Attribute) 值加上逸出符號,以免成為常值或處理常式名稱,而且這個動作必須更全面地實施 (而不是只對特定型別或屬性 (Property) 設定型別轉換子 (Type Converter)),則通常會實作標記延伸。 所有 XAML 標記延伸都會在其屬性 (Attribute) 語法中使用 { 與 } 字元,這個慣例讓 XAML 處理器知道某個標記延伸必須處理這個屬性 (Attribute)。 如需詳細資訊,請參閱標記延伸和 WPF XAML。