Xamarin.Forms Liaisons relatives
Les liaisons relatives permettent de définir la source de liaison par rapport à la position de la cible de liaison. Elles sont créées avec l’extension de RelativeSource
balisage et définies comme propriété Source
d’une expression de liaison.
L’extension de balisage RelativeSource
est prise en charge par la classe RelativeSourceExtension
, qui définit les propriétés suivantes :
Mode
, de typeRelativeBindingSourceMode
, décrit l’emplacement de la source de liaison par rapport à la position de la cible de liaison.AncestorLevel
, de typeint
, un niveau ancêtre facultatif à rechercher, lorsque laMode
propriété estFindAncestor
. UnAncestorLevel
desn
instances ignoren-1
les instances duAncestorType
.AncestorType
, de typeType
, le type d’ancêtre à rechercher, lorsque laMode
propriété estFindAncestor
.
Remarque
L’analyseur XAML permet à la classe RelativeSourceExtension
d’être abrégée en tant que RelativeSource
.
La Mode
propriété doit être définie sur l’un RelativeBindingSourceMode
des membres d’énumération :
TemplatedParent
indique l’élément auquel le modèle, dans lequel l’élément lié existe, est appliqué. Pour plus d’informations, consultez Lier à un parent modèle.Self
indique l’élément sur lequel la liaison est définie, ce qui vous permet de lier une propriété de cet élément à une autre propriété sur le même élément. Pour plus d’informations, consultez Lier à soi.FindAncestor
indique l’ancêtre dans l’arborescence visuelle de l’élément lié. Ce mode doit être utilisé pour établir une liaison à un contrôle ancêtre représenté par laAncestorType
propriété. Pour plus d’informations, consultez Lier à un ancêtre.FindAncestorBindingContext
indique l’ancêtreBindingContext
dans l’arborescence visuelle de l’élément lié. Ce mode doit être utilisé pour établir une liaison à l’ancêtreBindingContext
représenté par laAncestorType
propriété. Pour plus d’informations, consultez Lier à un ancêtre.
La Mode
propriété est la propriété de contenu de la RelativeSourceExtension
classe. Par conséquent, pour les expressions de balisage XAML exprimées avec accolades, vous pouvez éliminer la Mode=
partie de l’expression.
Pour plus d’informations sur les Xamarin.Forms extensions de balisage, consultez Extensions de balisage XAML.
Lier à l’auto
Le Self
mode de liaison relative est utilisé pour lier une propriété d’un élément à une autre propriété sur le même élément :
<BoxView Color="Red"
WidthRequest="200"
HeightRequest="{Binding Source={RelativeSource Self}, Path=WidthRequest}"
HorizontalOptions="Center" />
Dans cet exemple, la BoxView
propriété définit sa WidthRequest
propriété sur une taille fixe et la HeightRequest
propriété est liée à la WidthRequest
propriété. Par conséquent, les deux propriétés sont égales et un carré est dessiné :
Important
Lors de la liaison d’une propriété d’un élément à une autre propriété sur le même élément, les propriétés doivent être du même type. Vous pouvez également spécifier un convertisseur sur la liaison pour convertir la valeur.
Un usage courant de ce mode de liaison est défini sur une propriété d’un BindingContext
objet lui-même. Le code suivant en est un exemple :
<ContentPage ...
BindingContext="{Binding Source={RelativeSource Self}, Path=DefaultViewModel}">
<StackLayout>
<ListView ItemsSource="{Binding Employees}">
...
</ListView>
</StackLayout>
</ContentPage>
Dans cet exemple, la BindingContext
page est définie sur la DefaultViewModel
propriété de lui-même. Cette propriété est définie dans le fichier code-behind de la page et fournit une instance viewmodel. L’objet ListView
lie à la Employees
propriété du viewmodel.
Lier à un ancêtre
FindAncestorBindingContext
Les FindAncestor
modes de liaison relatifs sont utilisés pour lier des éléments parents, d’un certain type, dans l’arborescence visuelle. Le FindAncestor
mode est utilisé pour établir une liaison à un élément parent, qui dérive du Element
type. Le FindAncestorBindingContext
mode est utilisé pour établir une liaison à l’élément BindingContext
parent.
Avertissement
La AncestorType
propriété doit être définie sur une Type
valeur lors de l’utilisation des modes de FindAncestor
liaison relatifs, FindAncestorBindingContext
sinon une XamlParseException
exception est levée.
Si la Mode
propriété n’est pas définie explicitement, la définition de la AncestorType
propriété sur un type dérivé de Element
celui-ci définit implicitement la Mode
propriété FindAncestor
sur . De même, la définition de la AncestorType
propriété sur un type qui ne dérive pas de Element
la propriété définit implicitement la Mode
propriété FindAncestorBindingContext
sur .
Remarque
Les liaisons relatives qui utilisent le FindAncestorBindingContext
mode sont réappliquées lorsque les BindingContext
ancêtres changent.
Le code XAML suivant montre un exemple où la Mode
propriété sera implicitement définie sur FindAncestorBindingContext
:
<ContentPage ...
BindingContext="{Binding Source={RelativeSource Self}, Path=DefaultViewModel}">
<StackLayout>
<ListView ItemsSource="{Binding Employees}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Orientation="Horizontal">
<Label Text="{Binding Fullname}"
VerticalOptions="Center" />
<Button Text="Delete"
Command="{Binding Source={RelativeSource AncestorType={x:Type local:PeopleViewModel}}, Path=DeleteEmployeeCommand}"
CommandParameter="{Binding}"
HorizontalOptions="EndAndExpand" />
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage>
Dans cet exemple, la BindingContext
page est définie sur la DefaultViewModel
propriété de lui-même. Cette propriété est définie dans le fichier code-behind de la page et fournit une instance viewmodel. L’objet ListView
lie à la Employees
propriété du viewmodel. Le DataTemplate
, qui définit l’apparence de chaque élément dans le ListView
, contient un Button
. La propriété du Command
bouton est liée au DeleteEmployeeCommand
viewmodel de son parent. Le fait d’appuyer sur un Button
employé supprime :
En outre, la propriété facultative AncestorLevel
peut aider à désambiguer la recherche des ancêtres dans les scénarios où il existe peut-être plusieurs ancêtres de ce type dans l’arborescence visuelle :
<Label Text="{Binding Source={RelativeSource AncestorType={x:Type Entry}, AncestorLevel=2}, Path=Text}" />
Dans cet exemple, la Label.Text
propriété est liée à la Text
propriété de la seconde Entry
rencontrée sur le chemin vers le haut, en commençant à l’élément cible de la liaison.
Remarque
La AncestorLevel
propriété doit être définie sur 1 pour rechercher l’ancêtre le plus proche de l’élément cible de liaison.
Lier à un parent modèle
Le TemplatedParent
mode de liaison relative est utilisé pour lier à partir d’un modèle de contrôle à l’instance d’objet runtime à laquelle le modèle est appliqué (appelé parent modiné). Ce mode s’applique uniquement si la liaison relative se trouve dans un modèle de contrôle et est similaire à la définition d’un TemplateBinding
.
Le code XAML suivant illustre un exemple du TemplatedParent
mode de liaison relative :
<ContentPage ...>
<ContentPage.Resources>
<ControlTemplate x:Key="CardViewControlTemplate">
<Frame BindingContext="{Binding Source={RelativeSource TemplatedParent}}"
BackgroundColor="{Binding CardColor}"
BorderColor="{Binding BorderColor}"
...>
<Grid>
...
<Label Text="{Binding CardTitle}"
... />
<BoxView BackgroundColor="{Binding BorderColor}"
... />
<Label Text="{Binding CardDescription}"
... />
</Grid>
</Frame>
</ControlTemplate>
</ContentPage.Resources>
<StackLayout>
<controls:CardView BorderColor="DarkGray"
CardTitle="John Doe"
CardDescription="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla elit dolor, convallis non interdum."
IconBackgroundColor="SlateGray"
IconImageSource="user.png"
ControlTemplate="{StaticResource CardViewControlTemplate}" />
<controls:CardView BorderColor="DarkGray"
CardTitle="Jane Doe"
CardDescription="Phasellus eu convallis mi. In tempus augue eu dignissim fermentum. Morbi ut lacus vitae eros lacinia."
IconBackgroundColor="SlateGray"
IconImageSource="user.png"
ControlTemplate="{StaticResource CardViewControlTemplate}" />
<controls:CardView BorderColor="DarkGray"
CardTitle="Xamarin Monkey"
CardDescription="Aliquam sagittis, odio lacinia fermentum dictum, mi erat scelerisque erat, quis aliquet arcu."
IconBackgroundColor="SlateGray"
IconImageSource="user.png"
ControlTemplate="{StaticResource CardViewControlTemplate}" />
</StackLayout>
</ContentPage>
Dans cet exemple, l’élément Frame
racine de l’objet ControlTemplate
runtime a sa BindingContext
valeur définie sur l’instance d’objet runtime à laquelle le modèle est appliqué. Par conséquent, les Frame
enfants et les enfants résolvent leurs expressions de liaison par rapport aux propriétés de chaque CardView
objet :
Pour plus d’informations sur les modèles de contrôle, consultez Xamarin.Forms Modèles de contrôle.