Xamarin.Forms Záložní vazby
Někdy datové vazby selžou, protože zdroj vazby se nedá přeložit nebo protože vazba bude úspěšná, ale vrátí null
hodnotu. I když se tyto scénáře dají zpracovat pomocí převaděčů hodnot nebo jiného dalšího kódu, datové vazby mohou být robustnější definováním záložních hodnot, které se mají použít v případě selhání procesu vazby. Toho lze dosáhnout definováním FallbackValue
a TargetNullValue
vlastnostmi ve výrazu vazby. Vzhledem k tomu, že tyto vlastnosti jsou umístěny ve BindingBase
třídě, lze je použít s vazbami, více vazbami, kompilovanými vazbami a s rozšířením Binding
značek.
Poznámka:
FallbackValue
Použití vlastností ve TargetNullValue
výrazu vazby je volitelné.
Definování záložní hodnoty
Tato FallbackValue
vlastnost umožňuje definovat záložní hodnotu, která se použije, když zdroj vazby nelze přeložit. Běžným scénářem nastavení této vlastnosti je vazba na zdrojové vlastnosti, které nemusí existovat u všech objektů v vázané kolekci heterogenních typů.
Stránka MonkeyDetail znázorňuje nastavení FallbackValue
vlastnosti:
<Label Text="{Binding Population, FallbackValue='Population size unknown'}"
... />
Vazba na této Label
sadě definuje FallbackValue
hodnotu, která bude nastavena v cíli, pokud zdroj vazby nelze přeložit. Proto se hodnota definovaná FallbackValue
vlastností zobrazí, pokud Population
vlastnost v vázaném objektu neexistuje. Všimněte si, že zde FallbackValue
je hodnota vlastnosti oddělena znaky jednoduchých uvozovek (apostrof).
Místo definování FallbackValue
hodnot vlastností se doporučuje definovat je jako prostředky v objektu ResourceDictionary
. Výhodou tohoto přístupu je, že tyto hodnoty jsou definovány jednou v jednom umístění a jsou snadněji lokalizovatelné. Prostředky je pak možné načíst pomocí StaticResource
rozšíření značek:
<Label Text="{Binding Population, FallbackValue={StaticResource populationUnknown}}"
... />
Poznámka:
Vlastnost není možné nastavit FallbackValue
pomocí vazbového výrazu.
Tady je spuštěný program:
FallbackValue
Pokud vlastnost není nastavena ve výrazu vazby a cesta vazby nebo část cesty není vyřešena, BindableProperty.DefaultValue
je nastavena na cíl. Pokud je však FallbackValue
vlastnost nastavena a cesta vazby nebo část cesty není vyřešena, hodnota vlastnosti FallbackValue
hodnoty je nastavena v cíli. Proto na stránce MonkeyDetail se Label
zobrazí "Velikost populace neznámá", protože vázaný objekt nemá Population
vlastnost.
Důležité
Definovaný převaděč hodnot se nespustí ve výrazu vazby při FallbackValue
nastavení vlastnosti.
Definování hodnoty nahrazení null
Vlastnost TargetNullValue
umožňuje definovat náhradní hodnotu, která se použije při překladu zdroje vazby, ale hodnota je null
. Běžným scénářem nastavení této vlastnosti je vazba na zdrojové vlastnosti, které mohou být null
v vázané kolekci.
Stránka Monkeys znázorňuje nastavení TargetNullValue
vlastnosti:
<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>
Vazby na obou Image
Label
a definují TargetNullValue
hodnoty, které budou použity, pokud cesta vazby vrátí null
. Proto se hodnoty definované vlastnostmi TargetNullValue
zobrazí pro všechny objekty v kolekci, kde ImageUrl
nejsou definovány vlastnosti a Location
vlastnosti. Všimněte si, že hodnoty TargetNullValue
vlastností jsou oddělené znaky jednoduchých uvozovek (apostrof).
Místo definování TargetNullValue
hodnot vlastností se doporučuje definovat je jako prostředky v objektu ResourceDictionary
. Výhodou tohoto přístupu je, že tyto hodnoty jsou definovány jednou v jednom umístění a jsou snadněji lokalizovatelné. Prostředky je pak možné načíst pomocí StaticResource
rozšíření značek:
<Image Source="{Binding ImageUrl, TargetNullValue={StaticResource fallbackImageUrl}}"
... />
<Label Text="{Binding Location, TargetNullValue={StaticResource locationUnknown}}"
... />
Poznámka:
Vlastnost není možné nastavit TargetNullValue
pomocí vazbového výrazu.
Tady je spuštěný program:
TargetNullValue
Pokud vlastnost není nastavena ve výrazu vazby, zdrojová hodnota null
bude převedena, pokud je definován převaděč hodnot, naformátován, pokud StringFormat
je definován a výsledek je nastaven na cíl. Pokud je však TargetNullValue
vlastnost nastavena, zdrojová hodnota null
bude převedena, pokud je definován převaděč hodnot, a pokud je stále null
po převodu, hodnota TargetNullValue
vlastnosti je nastavena na cíl.
Důležité
Formátování řetězců není použito ve výrazu vazby při TargetNullValue
nastavení vlastnosti.