Compartir vía


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:

Enlace FallbackValue

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:

Enlace TargetNullValue

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.