RelativeSource, extension de balisage

Spécifie les propriétés d’une RelativeSource source de liaison, à utiliser dans une extension de balisage de liaison ou lors de la définition de la RelativeSource propriété d’un Binding élément établi en XAML.

Utilisation d'attributs XAML

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

Utilisation des attributs XAML (imbriqués dans l'extension de liaison)

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

Utilisation d'éléments objet XAML

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

-ou-

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

Valeurs XAML

Valeur Description
modeEnumValue Celui-ci peut avoir l'une des valeurs suivantes :

- Le jeton Selfde chaîne ; correspond à un RelativeSource tel élément créé avec sa Mode propriété définie sur Self.
- Le jeton TemplatedParentde chaîne ; correspond à un RelativeSource tel élément créé avec sa Mode propriété définie sur TemplatedParent.
- Le jeton PreviousDatade chaîne ; correspond à un RelativeSource tel élément créé avec sa Mode propriété définie sur PreviousData.
- Voir ci-dessous pour plus d’informations sur le FindAncestor mode.
FindAncestor Le jeton de chaîne FindAncestor. L'utilisation de ce jeton accède à un mode dans lequel un RelativeSource spécifie un type d'ancêtre et, en option, un niveau d'ancêtre. Ce correspond à un RelativeSource comme créé avec sa propriété Mode définie à FindAncestor.
typeName Nécessaire pour le mode FindAncestor. Le nom d'un type, qui remplit la propriété AncestorType.
intLevel Facultatif pour le mode FindAncestor. Un niveau d'ancêtre (évalué vers la direction du parent dans l'arborescence logique).

Notes

{RelativeSource TemplatedParent} les utilisations de liaison sont une technique clé qui traite un concept plus large de la séparation de l’interface utilisateur d’un contrôle et de la logique d’un contrôle. Cela permet la liaison à partir de la définition de modèle au parent basé sur des modèles (instance de l'objet à l'exécution où le modèle est appliqué). Dans ce cas, l’extension de balisage TemplateBinding est en fait un raccourci pour l’expression de liaison suivante : {Binding RelativeSource={RelativeSource TemplatedParent}}. TemplateBinding ou {RelativeSource TemplatedParent} les utilisations sont uniquement pertinentes dans le code XAML qui définit un modèle. Pour plus d’informations, consultez l’extension de balisage TemplateBinding.

{RelativeSource FindAncestor} est principalement utilisé dans les modèles de contrôle ou les compositions d’interface utilisateur autonomes prévisibles, pour les cas où un contrôle est toujours censé se trouver dans une arborescence visuelle d’un certain type ancêtre. Par exemple, les éléments d'un contrôle d'éléments peuvent utiliser des utilisations de FindAncestor pour les lier aux propriétés de leur ancêtre parent du contrôle d'éléments. Ou les éléments qui font partie de la composition de contrôle dans un modèle peuvent utiliser des liaisons de FindAncestor aux éléments parents dans cette même structure de composition.

Dans la syntaxe d'élément objet du mode FindAncestor indiqué dans les sections de syntaxe XAML, la deuxième syntaxe d'élément objet est utilisée spécifiquement pour le mode FindAncestor. Le mode FindAncestor requiert une valeur AncestorType. Vous devez définir AncestorType comme attribut à l’aide d’une référence x :Type Markup Extension au type d’ancêtre à rechercher. La valeur AncestorType est utilisée lorsque la demande de liaison est traitée lors de l'exécution.

Pour le mode FindAncestor, la propriété AncestorLevel facultative peut contribuer à désambiguïser la recherche d'ancêtre dans les cas où il existe peut-être plusieurs ancêtres de ce type présents dans l'arborescence d'éléments.

Pour plus d'informations sur l'utilisation du mode FindAncestor, consultez RelativeSource.

{RelativeSource Self} est utile pour les scénarios où une propriété d’une instance doit dépendre de la valeur d’une autre propriété de la même instance, et aucune relation de propriété de dépendance générale (telle que la contrainte) existe déjà entre ces deux propriétés. Bien qu’il soit rare que deux propriétés existent sur un objet de sorte que les valeurs soient littéralement identiques (et sont typées de façon identique), vous pouvez également appliquer un Converter paramètre à une liaison qui a {RelativeSource Self}, et utiliser le convertisseur pour convertir entre les types source et cible. Un autre scénario est {RelativeSource Self} dans le cadre d’un MultiDataTrigger.

Par exemple, le code XAML suivant définit un élément Rectangle tels que tout ce que la valeur est entrée pour Width, Rectangle est toujours angle droit : <Rectangle Width="200" Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}" .../>

{RelativeSource PreviousData} est utile dans les modèles de données ou dans les cas où les liaisons utilisent une collection comme source de données. Vous pouvez utiliser {RelativeSource PreviousData} pour mettre en évidence les relations entre les éléments de données adjacents de la collection. Une technique connexe est de générer MultiBinding entre des éléments actuels et précédents dans la source de données, et d'utiliser un convertisseur sur cette liaison pour déterminer la différence entre les deux éléments et leurs propriétés.

Dans l'exemple suivant, le premier TextBlock dans le modèle d'éléments affiche le numéro actuel. La deuxième TextBlock liaison est une MultiBinding valeur qui comporte Binding deux constituants : l’enregistrement actif et une liaison qui utilise délibérément l’enregistrement de données précédent à l’aide {RelativeSource PreviousData}de . Ensuite, un convertisseur sur MultiBinding calcule la différence et la retourne à la liaison.

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

La description de la liaison de données en tant que concept n’est pas abordée ici, consultez Vue d’ensemble de la liaison de données.

Dans l’implémentation du processeur XAML WPF, la gestion de cette extension de balisage est définie par la RelativeSource classe.

RelativeSource est une extension de balisage. Les extensions de balisage sont généralement implémentées pour éviter que les valeurs d’attribut ne soient autre chose que des valeurs littérales ou des noms de gestionnaire et lorsque l’exigence dépasse le cadre de la définition de convertisseurs de type sur certains types ou propriétés. Toutes les extensions de balisage en XAML utilisent les caractères et } les { caractères de leur syntaxe d’attribut, c’est-à-dire la convention par laquelle un processeur XAML reconnaît qu’une extension de balisage doit traiter l’attribut. Pour plus d’informations, consultez Extensions de balisage et XAML WPF.

Voir aussi