Partager via


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. Étant donné que ces propriétés résident dans la BindingBase classe, elles peuvent être utilisées avec des liaisons, des liaisons multi-liaisons, des liaisons compilées et avec l’extension de Binding balisage.

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 :

Liaison FallbackValue

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 :

TargetNullValue Binding

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.