Compartir vía


Reservas de enlace

Examinar ejemplo. Examinar el ejemplo

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. En una aplicación de .NET Multi-platform App UI (.NET MAUI), esto se puede lograr definiendo 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.

En el siguiente ejemplo se muestra cómo se establece la propiedad FallbackValue:

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

El enlace en Label define un valor de FallbackValue (delimitador por comillas simples) 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.

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.

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:

Enlace FallbackValue

Por lo tanto, en este ejemplo Label muestra el mensaje "Population size unknown", porque al objeto 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.

En el siguiente ejemplo se muestra cómo se establece 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 (delimitados por comillas simples) que se aplicarán 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.

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.

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:

Enlace TargetNullValue.

Por lo tanto, en este ejemplo, los objetos Image y Label muestran su TargetNullValue cuando sus objetos de origen son null.

Importante

No se aplicará formato a la cadena en una expresión de enlace cuando la propiedad TargetNullValue esté establecida.

Comparación de TargetNullValue y FallbackValue

Tanto TargetNullValue como FallbackValue se usan en enlaces de datos para controlar escenarios en los que el valor enlazado es null o cuando se produce un error en el enlace. Saber cuándo usar cada uno ayuda a garantizar una experiencia de usuario fluida.

TargetNullValue

Usa la propiedad TargetNullValue para especificar un valor para mostrar cuando el enlace se realiza correctamente pero la propiedad enlazada es null:

<Label Text="{Binding FirstName, TargetNullValue='No name available'}" />

En este ejemplo, si FirstName es null el Label mostrará "No hay ningún nombre disponible".

FallbackValue

Usa la propiedad FallbackValue para proporcionar un valor cuando se produzca un error en el proceso de enlace por completo, como una ruta de acceso incorrecta o un contexto de enlace que falta:

<Label Text="{Binding FirstName, FallbackValue='Binding failed'}" />

En este ejemplo, si se produce un error en el enlace, Label mostrará "Error de enlace".

Uso combinado

Las propiedades TargetNullValue y FallbackValue pueden combinarse en una única expresión de enlace:

<Label Text="{Binding FirstName, TargetNullValue='No name available', FallbackValue='Binding failed'}" />