Xamarin.Forms Secours de liaison
Une liaison de données échoue parfois car la source de la liaison ne peut pas être résolue ou parce que la liaison réussit mais retourne une valeur null
. De tels scénarios peuvent être gérés avec des convertisseurs de valeurs ou du code supplémentaire, mais il est possible de renforcer les liaisons de données en définissant des valeurs de repli à utiliser si le processus de liaison échoue. Pour cela, vous pouvez définir les propriétés FallbackValue
et TargetNullValue
dans une expression de liaison. Comme ces propriétés résident dans la classe BindingBase
, elles peuvent être utilisées avec des liaisons, des liaisons multiples, des liaisons compilées et l’extension de balisage Binding
.
Remarque
L’utilisation des propriétés FallbackValue
et TargetNullValue
dans une expression de liaison est facultative.
Définition d’une valeur de repli
La propriété FallbackValue
permet de définir une valeur de repli à utiliser si la source de la liaison ne peut pas être résolue. Un scénario courant pour définir cette propriété est lors d’une liaison à des propriétés de source qui n’existent peut-être pas sur tous les objets d’une collection liée de types hétérogènes.
La page MonkeyDetail illustre la définition de la propriété FallbackValue
:
<Label Text="{Binding Population, FallbackValue='Population size unknown'}"
... />
La liaison sur l’objet Label
définit une valeur FallbackValue
qui sera définie sur la cible si la source de la liaison ne peut pas être résolue. Par conséquent, la valeur définie par la propriété FallbackValue
s’affiche si la propriété Population
n’existe pas sur l’objet lié. Notez qu’ici la valeur de propriété FallbackValue
est délimitée par des guillemets simples (apostrophes).
Au lieu de définir des valeurs de propriété FallbackValue
incluses, il est recommandé de les définir en tant que ressources dans un ResourceDictionary
. L’avantage de cette approche est que ces valeurs sont définies une seule fois dans un emplacement unique et sont plus facilement localisables. Les ressources peuvent ensuite être récupérées à l’aide de l’extension de balisage StaticResource
:
<Label Text="{Binding Population, FallbackValue={StaticResource populationUnknown}}"
... />
Remarque
Il n’est pas possible de définir la propriété FallbackValue
avec une expression de liaison.
Voici le programme en cours d’exécution :
Lorsque la propriété FallbackValue
n’est pas définie dans une expression de liaison et que le chemin de liaison ou une partie de ce chemin n’est pas résolu(e), BindableProperty.DefaultValue
est défini sur la cible. Toutefois, lorsque la propriété FallbackValue
est définie et que le chemin de liaison ou une partie de ce chemin n’est pas résolu(e), la valeur de la propriété FallbackValue
est définie sur la cible. Par conséquent, dans la page MonkeyDetail, le Label
affiche « Population size unknown » (Taille de la population inconnue), car l’objet lié n’a pas de propriété Population
.
Important
Un convertisseur de valeurs défini n’est pas exécuté dans une expression de liaison lorsque la propriété FallbackValue
est définie.
Définition d’une valeur de remplacement de null
La propriété TargetNullValue
permet de définir une valeur de remplacement à utiliser si la source de la liaison est résolue mais que la valeur est null
. Un scénario courant pour définir cette propriété est lors d’une liaison à des propriétés de source qui peuvent être null
dans une collection liée.
La page Monkeys illustre la définition de la propriété TargetNullValue
:
<ListView ItemsSource="{Binding Monkeys}"
...>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid>
...
<Image Source="{Binding ImageUrl, TargetNullValue='https://upload.wikimedia.org/wikipedia/commons/2/20/Point_d_interrogation.jpg'}"
... />
...
<Label Text="{Binding Location, TargetNullValue='Location unknown'}"
... />
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Les liaisons sur Image
et Label
définissent toutes les deux des valeurs TargetNullValue
qui seront appliquées si le chemin de liaison retourne null
. Par conséquent, les valeurs définies par les propriétés TargetNullValue
seront affichées pour tous les objets dans la collection où les propriétés ImageUrl
et Location
ne sont pas définies. Notez qu’ici les valeurs de propriété TargetNullValue
sont délimitées par des guillemets simples (apostrophes).
Au lieu de définir des valeurs de propriété TargetNullValue
incluses, il est recommandé de les définir en tant que ressources dans un ResourceDictionary
. L’avantage de cette approche est que ces valeurs sont définies une seule fois dans un emplacement unique et sont plus facilement localisables. Les ressources peuvent ensuite être récupérées à l’aide de l’extension de balisage StaticResource
:
<Image Source="{Binding ImageUrl, TargetNullValue={StaticResource fallbackImageUrl}}"
... />
<Label Text="{Binding Location, TargetNullValue={StaticResource locationUnknown}}"
... />
Remarque
Il n’est pas possible de définir la propriété TargetNullValue
avec une expression de liaison.
Voici le programme en cours d’exécution :
Lorsque la propriété TargetNullValue
n’est pas définie dans une expression de liaison, une valeur source null
est convertie si un convertisseur de valeurs est défini, formatée si un StringFormat
est défini, et le résultat est ensuite défini sur la cible. Toutefois, lorsque la propriété TargetNullValue
est définie, une valeur source null
est convertie si un convertisseur de valeurs est défini, et si elle est encore null
après la conversion, la valeur de la propriété TargetNullValue
est définie sur la cible.
Important
Le formatage de chaîne n’est pas appliqué dans une expression de liaison lorsque la propriété TargetNullValue
est définie.