Conmutación por recuperación de enlaces de Xamarin.Forms
En ocasiones, los enlaces de datos producen errores, porque no se puede resolver el origen de enlace o porque el enlace se realiza correctamente pero devuelve un valor null
. Si bien estos escenarios se pueden controlar con los convertidores de valor, u otro código adicional, los enlaces de datos pueden hacerse más sólidos mediante la definición de valores de reserva para su uso si se produce un error en el proceso de enlace. Esto puede realizarse mediante la definición de las propiedades FallbackValue
y TargetNullValue
en una expresión de enlace. Dado que estas propiedades residen en la clase BindingBase
, pueden usarse con enlaces, enlaces múltiples, enlaces compilados y la extensión de marcado Binding
.
Nota:
El uso de las propiedades FallbackValue
y TargetNullValue
en una expresión de enlace es opcional.
Definición de un valor de reserva
La propiedad FallbackValue
permite que se pueda definir un valor de reserva que se usará cuando el origen del enlace no se pueda resolver. Un escenario común para establecer esta propiedad es cuando se realiza el enlace con propiedades de origen que podrían no existir en todos los objetos en una colección enlazada de tipos heterogéneos.
La página MonkeyDetail ilustra el establecimiento de la propiedad FallbackValue
:
<Label Text="{Binding Population, FallbackValue='Population size unknown'}"
... />
El enlace en Label
define un valor de FallbackValue
que se establecerá en el destino si no se puede resolver el origen del enlace. Por lo tanto, el valor definido por la propiedad FallbackValue
se mostrará si la propiedad Population
no existe en el objeto enlazado. Tenga en cuenta que aquí, el valor de la propiedad FallbackValue
está delimitado por caracteres de comillas simples (apóstrofo).
En lugar de definir los valores de la propiedad FallbackValue
en línea, se recomienda definirlos como recursos en ResourceDictionary
. La ventaja de este enfoque es que estos valores se definen una vez en una sola ubicación y son localizables más fácilmente. Posteriormente, se pueden recuperar los recursos mediante la extensión de marcado StaticResource
:
<Label Text="{Binding Population, FallbackValue={StaticResource populationUnknown}}"
... />
Nota:
No es posible establecer la propiedad FallbackValue
con una expresión de enlace.
Esta es la ejecución del programa:
Cuando el FallbackValue
propiedad no está establecida en una expresión de enlace y la ruta de acceso del enlace o parte de la ruta de acceso no se resuelve, BindableProperty.DefaultValue
se establece en el destino. Sin embargo, cuando la propiedad FallbackValue
está establecida y la ruta de acceso del enlace o parte de la ruta de acceso no se resuelve, el valor de la propiedad del valor FallbackValue
se establece en el destino. Por lo tanto, en la página MonkeyDetail, Label
muestra el mensaje "Population size unknown" ("Tamaño de la población desconocido"), porque al elemento enlazado le falta una propiedad Population
.
Importante
Un convertidor de valores definido no se ejecuta en una expresión de enlace cuando la propiedad FallbackValue
está establecida.
Definición de un valor de reemplazo nulo
La propiedad TargetNullValue
permite que se pueda definir un valor de reemplazo que se usará cuando el origen del enlace se resuelva pero el valor sea null
. Un escenario común para establecer esta propiedad es cuando se realiza el enlace con propiedades de origen que podrían ser null
en una colección enlazada.
La página Monkeys ilustra el establecimiento de la propiedad 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>
Los enlaces en Image
y Label
definen valores TargetNullValue
que se aplicará si la ruta de acceso de enlace devuelve null
. Por lo tanto, los valores definidos por las propiedades TargetNullValue
se mostrarán para los objetos de la colección donde las propiedades ImageUrl
y Location
no estén definidas. Tenga en cuenta que aquí, los valores de la propiedad TargetNullValue
están delimitados por caracteres de comillas simples (apóstrofo).
En lugar de definir los valores de la propiedad TargetNullValue
en línea, se recomienda definirlos como recursos en ResourceDictionary
. La ventaja de este enfoque es que estos valores se definen una vez en una sola ubicación y son localizables más fácilmente. Posteriormente, se pueden recuperar los recursos mediante la extensión de marcado StaticResource
:
<Image Source="{Binding ImageUrl, TargetNullValue={StaticResource fallbackImageUrl}}"
... />
<Label Text="{Binding Location, TargetNullValue={StaticResource locationUnknown}}"
... />
Nota:
No es posible establecer la propiedad TargetNullValue
con una expresión de enlace.
Esta es la ejecución del programa:
Cuando la propiedad TargetNullValue
no está establecida en una expresión de enlace, un valor de origen de null
se convertirá si se define un convertidor de valores, se le aplicará formato si se define StringFormat
y, a continuación, se establecerá el resultado en el destino. Sin embargo, cuando la propiedad TargetNullValue
está establecida, un valor de origen de null
se convertirá si se ha definido un convertidor de valores, y si sigue siendo null
después de la conversión, el valor de la propiedad TargetNullValue
está establecido en el destino.
Importante
No se aplicará formato a la cadena en una expresión de enlace cuando la propiedad TargetNullValue
esté establecida.