Xamarin.Forms Liaisons relatives
Les liaisons relatives permettent de définir la source de liaison par rapport à la position de la cible de liaison. Ils sont créés avec l’extension de RelativeSource
balisage et définis comme propriété Source
d’une expression de liaison.
L’extension RelativeSource
de balisage est prise en charge par la RelativeSourceExtension
classe, 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
, niveau ancêtre facultatif à rechercher, lorsque laMode
propriété estFindAncestor
. deAncestorLevel
ignoren
lesn-1
instances duAncestorType
.AncestorType
, de typeType
, type d’ancêtre à rechercher, lorsque laMode
propriété estFindAncestor
.
Notes
L’analyseur XAML permet à la RelativeSourceExtension
classe d’être abrégée en RelativeSource
.
La Mode
propriété doit être définie sur l’un des membres d’énumération RelativeBindingSourceMode
:
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 à l’auto.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 leBindingContext
de l’ancêtre dans l’arborescence visuelle de l’élément lié. Ce mode doit être utilisé pour lier auBindingContext
d’un ancêtre 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 des accolades, vous pouvez éliminer la Mode=
partie de l’expression.
Pour plus d’informations sur Xamarin.Forms les extensions de balisage, consultez Extensions de balisage XAML.
Se lier à soi-même
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, le BoxView
définit sa WidthRequest
propriété sur une taille fixe et la HeightRequest
propriété se lie à la WidthRequest
propriété . Par conséquent, les deux propriétés sont égales et un carré est donc 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.
Une utilisation courante de ce mode de liaison est de définir un objet BindingContext
sur une propriété sur lui-même. Le code suivant montre un exemple de ceci :
<ContentPage ...
BindingContext="{Binding Source={RelativeSource Self}, Path=DefaultViewModel}">
<StackLayout>
<ListView ItemsSource="{Binding Employees}">
...
</ListView>
</StackLayout>
</ContentPage>
Dans cet exemple, le BindingContext
de la page est défini sur la DefaultViewModel
propriété d’elle-même. Cette propriété est définie dans le fichier code-behind de la page et fournit une instance viewmodel. L’objet ListView
est lié à la Employees
propriété du viewmodel.
Lier à un ancêtre
Les FindAncestor
modes de liaison relative et FindAncestorBindingContext
sont utilisés pour lier des éléments parents, d’un certain type, dans l’arborescence visuelle. Le FindAncestor
mode est utilisé pour lier à un élément parent, qui dérive du Element
type . Le FindAncestorBindingContext
mode est utilisé pour lier au BindingContext
d’un élément parent.
Avertissement
La AncestorType
propriété doit être définie sur un Type
lors de l’utilisation des FindAncestor
modes de liaison relative et FindAncestorBindingContext
, sinon, un XamlParseException
est levée.
Si la Mode
propriété n’est pas définie explicitement, le fait de définir la AncestorType
propriété sur un type qui dérive de Element
définit implicitement la Mode
propriété sur FindAncestor
. De même, le fait de définir la AncestorType
propriété sur un type qui ne dérive pas de Element
définit implicitement la Mode
propriété sur FindAncestorBindingContext
.
Notes
Les liaisons relatives qui utilisent le FindAncestorBindingContext
mode seront réappliquées lorsque le BindingContext
des ancêtres change.
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, le BindingContext
de la page est défini sur la DefaultViewModel
propriété d’elle-même. Cette propriété est définie dans le fichier code-behind de la page et fournit une instance viewmodel. L’objet ListView
est lié à la Employees
propriété du viewmodel. , DataTemplate
qui définit l’apparence de chaque élément dans , ListView
contient un Button
. La propriété du Command
bouton est liée à dans le DeleteEmployeeCommand
mode de vue de son parent. Le fait d’appuyer sur un Button
supprime un employé :
En outre, la propriété facultative AncestorLevel
peut aider à lever l’ambiguïté de la recherche d’ancêtre dans les scénarios où il y a 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.
Notes
La AncestorLevel
propriété doit avoir la valeur 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’objet runtime instance auquel le modèle est appliqué (appelé parent de modèle). 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 montre un exemple de 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, , Frame
qui est l’élément racine de , ControlTemplate
a sa BindingContext
valeur définie sur l’objet runtime instance auquel le modèle est appliqué. Par conséquent, et Frame
ses 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.