Sdílet prostřednictvím


RelativeSource MarkupExtension

Určuje vlastnosti zdroje RelativeSource jako vazby, které mají být použity v rámci Binding Markup Extension, nebo při nastavování vlastnosti RelativeSource elementu Binding vytvořeného v XAML.

Použití atributu XAML

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

Použití atributů XAML (vnořené do rozšíření Binding)

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

Použití elementu objektu XAML

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

-nebo-

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

Hodnoty XAML

Hodnota Popis
modeEnumValue Jedna z následujících možností:

- Řetězcový token Selfodpovídá RelativeSource, které bylo vytvořeno s vlastností Mode nastavenou na Self.
- Řetězcový token TemplatedParent; odpovídá RelativeSource vytvořenému, kde jeho vlastnost Mode je nastavena na TemplatedParent.
- Řetězcový token PreviousDataodpovídá RelativeSource vytvořenému s jeho vlastností Mode nastavenou na PreviousData.
- Informace o FindAncestor režimu najdete níže.
FindAncestor Řetězcový token FindAncestor. Použití tohoto tokenu přejde do režimu, kdy RelativeSource určuje nadřazený typ a volitelně nadřazenou úroveň. To odpovídá RelativeSource, které bylo vytvořeno s její vlastností Mode nastavenou na FindAncestor.
typeName Vyžaduje se pro režim FindAncestor. Název typu, který vyplňuje vlastnost AncestorType.
intLevel Volitelné pro režim FindAncestor. Nadřazená úroveň (vyhodnocená směrem k nadřazenému směru v logickém stromu)

Poznámky

{RelativeSource TemplatedParent} použití vazeb jsou klíčovou technikou, která řeší větší koncept oddělení uživatelského rozhraní ovládacího prvku a logiky ovládacího prvku. To umožňuje vazbu z definice šablony na nadřazený objekt (instanci objektu runtime, ve které je šablona použita). V tomto případě je rozšíření TemplateBinding Markup ve skutečnosti zkratkou pro následující vazbový výraz: {Binding RelativeSource={RelativeSource TemplatedParent}}. TemplateBinding nebo {RelativeSource TemplatedParent} použití jsou relevantní pouze v rámci XAML, který definuje šablonu. Další informace naleznete v tématu TemplateBinding Markup Extension.

{RelativeSource FindAncestor} se používá v šablonách ovládacích prvků nebo v předvídatelných samostatných kompozicích uživatelského rozhraní, v případech, kdy se očekává, že prvek ovládání bude vždy ve vizuálním stromu určitého nadřazeného typu. Například položky ovládacího prvku můžou používat vazebné vzory FindAncestor pro připojení k vlastnostem jejich nadřazeného prvku. Nebo prvky, které jsou součástí kompozice řízení v šabloně, mohou použít FindAncestor vazby k nadřazeným prvkům ve stejné struktuře kompozice.

V syntaxi elementu objektu pro FindAncestor režim zobrazený v oddílech Syntaxe XAML se druhá syntaxe elementu objektu používá speciálně pro FindAncestor režim. FindAncestor režim vyžaduje hodnotu AncestorType. Je nutné nastavit AncestorType jako atribut pomocí rozšíření x:Type Markup Extension odkaz na typ nadřazeného objektu, který chcete vyhledat. Hodnota AncestorType se používá při zpracování požadavku vazby během běhu programu.

V módu FindAncestor může volitelná vlastnost AncestorLevel pomoci s objasněním vyhledávání předků v případech, kdy ve stromě prvků existuje možná více než jeden prvek tohoto typu.

Další informace o použití režimu FindAncestor naleznete v tématu RelativeSource.

{RelativeSource Self} je užitečná ve scénářích, kdy má jedna vlastnost instance záviset na hodnotě jiné vlastnosti téže instance, a mezi těmito dvěma vlastnostmi neexistuje žádný obecný vztah závislosti (například donucení). I když je vzácné, že na objektu existují dvě vlastnosti tak, že hodnoty jsou doslova identické (a stejně typované), můžete také použít parametr Converter na vazbu, která má {RelativeSource Self}, a použít převaděč k převodu mezi zdrojovými a cílovými typy. Další scénář pro {RelativeSource Self} je součástí MultiDataTrigger.

Například následující XAML definuje Rectangle prvek tak, aby bez ohledu na hodnotu zadaná pro Width, Rectangle je vždy čtverec: <Rectangle Width="200" Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}" .../>

{RelativeSource PreviousData} je užitečná buď v šablonách dat, nebo v případech, kdy vazby používají kolekci jako zdroj dat. Pomocí {RelativeSource PreviousData} můžete zvýraznit vztahy mezi sousedními datovými položkami v kolekci. Související technika spočívá v vytvoření MultiBinding mezi aktuálními a předchozími položkami ve zdroji dat a pomocí převaděče na této vazbě určit rozdíl mezi těmito dvěma položkami a jejich vlastnostmi.

V následujícím příkladu první TextBlock v šabloně položek zobrazí aktuální číslo. Druhá vazba TextBlock je MultiBinding, která má jmenovitě dvě Binding prvky: aktuální záznam a vazbu, která záměrně používá předchozí datový záznam pomocí {RelativeSource PreviousData}. Pak převodník na MultiBinding vypočítá rozdíl a vrátí ho zpět k propojení.

<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>

Popis datové vazby jako konceptu zde není popsaný, viz Přehled datových vazeb.

V implementaci procesoru WPF XAML je zpracování tohoto značkovacího rozšíření definováno třídou RelativeSource.

RelativeSource je rozšíření značek. Rozšíření značek se obvykle implementují, pokud existuje požadavek, aby hodnota atributů byla odlišná od literálních hodnot nebo názvů funkcí zpracování, a tento požadavek je širší než pouhé používání převodníků typů pro konkrétní typy nebo vlastnosti. Všechna rozšíření značek v XAML používají { a } znaky v syntaxi atributu, což je konvence, kterou procesor XAML rozpozná, že rozšíření značek musí zpracovat atribut. Další informace naleznete v tématu Rozšíření značek a WPF XAML.

Viz také