Compartilhar via


Xamarin.Forms Fallbacks de associação

Às vezes, as associações de dados falham porque a origem da associação não pode ser resolvida ou porque a associação tem êxito, mas retorna um valor null. Embora esses cenários possam ser manipulados com conversores de valor ou outro código adicional, as associações de dados poderão se tornar mais robustas com a definição de valores de fallback a serem usados se o processo de associação falhar. Isso pode ser feito com a definição das propriedades FallbackValue e TargetNullValue em uma expressão de associação. Como essas propriedades residem na classe BindingBase, elas podem ser usadas com associações, assocoações múltiplas, associações compiladas e com a extensão de marcação Binding.

Observação

O uso das propriedades FallbackValue e TargetNullValue em uma expressão de associação é opcional.

Definindo um valor de fallback

A propriedade FallbackValue permite a definição de um valor de fallback que será usado quando a origem da associação não puder ser resolvida. Um cenário comum para definir essa propriedade é ao fazer a associação a propriedades de origem que podem não existir em todos os objetos em uma coleção associada de tipos heterogêneos.

A página MonkeyDetail ilustra a definição da propriedade FallbackValue:

<Label Text="{Binding Population, FallbackValue='Population size unknown'}"
       ... />   

A associação no Label definirá um valor FallbackValue que será definido no destino se a origem da associação não puder ser resolvida. Portanto, o valor definido pela propriedade FallbackValue será exibido se a propriedade Population não existir no objeto associado. Observe que aqui o valor da propriedade FallbackValue é delimitado por caracteres de aspas simples (apóstrofo).

Em vez de definir os valores da propriedade FallbackValue de forma embutida, recomendamos defini-los como recursos em um ResourceDictionary. A vantagem dessa abordagem é que esses valores são definidos uma única vez em uma só localização e são mais facilmente localizáveis. Em seguida, os recursos podem ser recuperados usando a extensão de marcação StaticResource:

<Label Text="{Binding Population, FallbackValue={StaticResource populationUnknown}}"
       ... />  

Observação

Não é possível definir a propriedade FallbackValue com uma expressão de associação.

Este é o programa em execução:

Associação FallbackValue

Quando a propriedade FallbackValue não está definida em uma expressão de associação e o caminho de associação ou parte do caminho não está resolvido, BindableProperty.DefaultValue é definido no destino. No entanto, quando a propriedade FallbackValue está definida e o caminho de associação ou parte do caminho não está resolvido, o valor da propriedade de valor FallbackValue é definido no destino. Portanto, na página MonkeyDetail, o Label exibe "Tamanho da população desconhecido", porque o objeto associado não tem uma propriedade Population.

Importante

Um conversor de valor definido não é executado em uma expressão de associação quando a propriedade FallbackValue está definida.

Definindo um valor de substituição nulo

A propriedade TargetNullValue permite a definição de um valor de substituição que será usado quando a origem da associação for resolvida, mas o valor for null. Um cenário comum para definir essa propriedade é ao associar as propriedades de origem que podem ser null em uma coleção associada.

A página Monkeys ilustra a definição da propriedade 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>

As associações no Image e Label definem valores TargetNullValue que serão aplicados se o caminho de associação retornar null. Portanto, os valores definidos pelas propriedades TargetNullValue serão exibidos para todos os objetos na coleção em que as propriedades ImageUrl e Location não estiverem definidas. Observe que aqui os valores da propriedade TargetNullValue são delimitados por caracteres de aspas simples (apóstrofo).

Em vez de definir os valores da propriedade TargetNullValue de forma embutida, recomendamos defini-los como recursos em um ResourceDictionary. A vantagem dessa abordagem é que esses valores são definidos uma única vez em uma só localização e são mais facilmente localizáveis. Em seguida, os recursos podem ser recuperados usando a extensão de marcação StaticResource:

<Image Source="{Binding ImageUrl, TargetNullValue={StaticResource fallbackImageUrl}}"
       ... />
<Label Text="{Binding Location, TargetNullValue={StaticResource locationUnknown}}"
       ... />

Observação

Não é possível definir a propriedade TargetNullValue com uma expressão de associação.

Este é o programa em execução:

Associação TargetNullValue

Quando a propriedade TargetNullValue não estiver definida em uma expressão de associação, um valor de origem igual a null será convertido se um conversor de valor for definido, formatado se um StringFormat for definido e o resultado será então definido no destino. No entanto, quando a propriedade TargetNullValue for definida, um valor de origem igual a null será convertido se um conversor de valor for definido e se ele ainda for null após a conversão, o valor da propriedade TargetNullValue será definido no destino.

Importante

A formatação de cadeia de caracteres não é aplicada em uma expressão de associação quando a propriedade TargetNullValue está definida.