RelativeSource 標記延伸

指定系結來源的屬性 RelativeSource 、用於 系結標記延伸 ,或在設定 RelativeSource XAML 中建立之 Binding 專案的 屬性時使用。

XAML Attribute Usage

<Binding RelativeSource="{RelativeSource modeEnumValue}" ... />

XAML 屬性使用方式 (以巢狀方式置於 Binding 延伸內)

<object property="{Binding RelativeSource={RelativeSource modeEnumValue} ...}" ... />

XAML 物件項目用法

<Binding>
  <Binding.RelativeSource>
    <RelativeSource Mode="modeEnumValue"/>
  </Binding.RelativeSource>
</Binding>

-或-

<Binding>
  <Binding.RelativeSource>
    <RelativeSource
      Mode="FindAncestor"
      AncestorType="{x:Type typeName}"
      AncestorLevel="intLevel"
    />
  </Binding.RelativeSource>
</Binding>

XAML 值

Description
modeEnumValue 下列其中一項:

- 字串標記 Self ;對應至 RelativeSource ,其 Mode 屬性設定為 Self 時所建立的 。
- 字串標記 TemplatedParent ;對應至 RelativeSource ,其 Mode 屬性設定為 TemplatedParent 時所建立的 。
- 字串標記 PreviousData ;對應至 RelativeSource ,其 Mode 屬性設定為 PreviousData 時所建立的 。
- 如需模式的相關資訊, FindAncestor 請參閱下文。
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} 主要用於控制項範本或可預測的自封 UI 組合,適用于一律預期控制項位於特定上階類型的視覺化樹狀結構中的情況。 例如,項目控制項的項目可能會使用 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 會顯示目前的號碼。 第二 TextBlockMultiBinding 系結是名義上具有兩 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>
</ListBox>

此處未說明將資料系結描述為概念,請參閱 資料系結概觀

在 WPF XAML 處理器實作中,這個標記延伸的處理是由 RelativeSource 類別所定義。

RelativeSource 是一種標記延伸。 如果必須將屬性 (Attribute) 值加上逸出符號,以免成為常值或處理常式名稱,而且這個動作必須更全面地實施 (而不是只對特定類型或屬性 (Property) 設定類型轉換子 (Type Converter)),則通常會實作標記延伸。 XAML 中的所有標記延伸都會在其 { 屬性語法中使用 和 } 字元,這是 XAML 處理器辨識標記延伸必須處理屬性的慣例。 如需詳細資訊,請參閱標記延伸和 WPF XAML

另請參閱