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:
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:
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.