Xamarin.Forms Rezerwowe powiązania
Czasami powiązania danych kończą się niepowodzeniem, ponieważ nie można rozpoznać źródła powiązania lub powiązanie kończy się powodzeniem null
, ale zwraca wartość. Chociaż te scenariusze można obsłużyć za pomocą konwerterów wartości lub innego dodatkowego kodu, powiązania danych mogą być bardziej niezawodne, definiując wartości rezerwowe do użycia, jeśli proces powiązania zakończy się niepowodzeniem. Można to osiągnąć, definiując FallbackValue
właściwości i TargetNullValue
w wyrażeniu powiązania. Ponieważ te właściwości znajdują się w BindingBase
klasie, mogą być używane z powiązaniami, powiązaniami wielowiążowymi, skompilowanymi powiązaniami i Binding
rozszerzeniem znaczników.
Uwaga
FallbackValue
Użycie właściwości i TargetNullValue
w wyrażeniu powiązania jest opcjonalne.
Definiowanie wartości rezerwowej
Właściwość FallbackValue
umożliwia zdefiniowanie wartości rezerwowej, która będzie używana, gdy nie można rozpoznać źródła powiązania. Typowym scenariuszem ustawiania tej właściwości jest powiązanie z właściwościami źródłowymi, które mogą nie istnieć we wszystkich obiektach w powiązanej kolekcji typów heterogenicznych.
Strona MonkeyDetail ilustruje ustawienie FallbackValue
właściwości:
<Label Text="{Binding Population, FallbackValue='Population size unknown'}"
... />
Powiązanie w obiekcie Label
definiuje FallbackValue
wartość, która zostanie ustawiona na obiekcie docelowym, jeśli nie można rozpoznać źródła powiązania. W związku z tym wartość zdefiniowana FallbackValue
przez właściwość będzie wyświetlana, jeśli Population
właściwość nie istnieje w powiązanym obiekcie. Zwróć uwagę, że tutaj FallbackValue
wartość właściwości jest rozdzielana znakami pojedynczego cudzysłowu (apostrofem).
Zamiast definiować FallbackValue
wartości właściwości w tekście, zaleca się zdefiniowanie ich jako zasobów w obiekcie ResourceDictionary
. Zaletą tego podejścia jest to, że takie wartości są definiowane raz w jednej lokalizacji i łatwiej lokalizują. Zasoby można następnie pobrać przy użyciu StaticResource
rozszerzenia znaczników:
<Label Text="{Binding Population, FallbackValue={StaticResource populationUnknown}}"
... />
Uwaga
Nie można ustawić FallbackValue
właściwości za pomocą wyrażenia powiązania.
Oto uruchomiony program:
FallbackValue
Jeśli właściwość nie jest ustawiona w wyrażeniu powiązania, a ścieżka powiązania lub część ścieżki nie jest rozpoznawana, BindableProperty.DefaultValue
jest ustawiona na obiekcie docelowym. Jednak gdy FallbackValue
właściwość jest ustawiona, a ścieżka powiązania lub część ścieżki nie jest rozpoznawana, wartość właściwości value FallbackValue
jest ustawiana na obiekcie docelowym. W związku z tym na stronie Label
MonkeyDetail zostanie wyświetlony komunikat "Rozmiar populacji nieznany", ponieważ obiekt powiązany nie ma Population
właściwości.
Ważne
Zdefiniowany konwerter wartości nie jest wykonywany w wyrażeniu powiązania, gdy właściwość jest ustawiona FallbackValue
.
Definiowanie wartości zastępczej o wartości null
Właściwość TargetNullValue
umożliwia zdefiniowanie wartości zastępczej, która będzie używana podczas rozpoznawania źródła powiązania, ale wartość to null
. Typowym scenariuszem ustawiania tej właściwości jest powiązanie z właściwościami źródłowymi, które mogą znajdować się null
w powiązanej kolekcji.
Strona Małpy ilustruje ustawienie TargetNullValue
właściwości:
<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>
Powiązania w obiekcie Image
i Label
definiują TargetNullValue
wartości, które zostaną zastosowane, jeśli ścieżka powiązania zwróci wartość null
. W związku z tym wartości zdefiniowane przez TargetNullValue
właściwości będą wyświetlane dla wszystkich obiektów w kolekcji, w których ImageUrl
właściwości i Location
nie są zdefiniowane. Zwróć uwagę, że tutaj TargetNullValue
wartości właściwości są rozdzielane znakami pojedynczego cudzysłowu (apostrofem).
Zamiast definiować TargetNullValue
wartości właściwości w tekście, zaleca się zdefiniowanie ich jako zasobów w obiekcie ResourceDictionary
. Zaletą tego podejścia jest to, że takie wartości są definiowane raz w jednej lokalizacji i łatwiej lokalizują. Zasoby można następnie pobrać przy użyciu StaticResource
rozszerzenia znaczników:
<Image Source="{Binding ImageUrl, TargetNullValue={StaticResource fallbackImageUrl}}"
... />
<Label Text="{Binding Location, TargetNullValue={StaticResource locationUnknown}}"
... />
Uwaga
Nie można ustawić TargetNullValue
właściwości za pomocą wyrażenia powiązania.
Oto uruchomiony program:
TargetNullValue
Jeśli właściwość nie jest ustawiona w wyrażeniu powiązania, wartość null
źródłowa klasy zostanie przekonwertowana, jeśli jest zdefiniowany konwerter wartości, sformatowany, jeśli StringFormat
element jest zdefiniowany, a wynik zostanie ustawiony na obiekcie docelowym. Jednak po ustawieniu TargetNullValue
właściwości wartość null
źródłowa zostanie przekonwertowana, jeśli jest zdefiniowany konwerter wartości, a jeśli jest nadal null
po konwersji, wartość TargetNullValue
właściwości jest ustawiona na wartość docelową.
Ważne
Formatowanie ciągu nie jest stosowane w wyrażeniu powiązania, gdy właściwość jest ustawiona TargetNullValue
.