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. W aplikacji interfejsu użytkownika aplikacji wieloplatformowej platformy .NET (.NET MAUI) można to zrobić, 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.
W poniższym przykładzie pokazano ustawienie FallbackValue właściwości :
<Label Text="{Binding Population, FallbackValue='Population size unknown'}"
... />
Powiązanie w obiekcie Label definiuje FallbackValue wartość (rozdzielaną znakami pojedynczego cudzysłowu), 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.
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.
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 w tym przykładzie wyświetlany jest Label 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.
W poniższym przykładzie pokazano ustawienie TargetNullValue właściwości :
<ListView ItemsSource="{Binding Monkeys}"
...>
<ListView.ItemTemplate>
<DataTemplate x:DataType="local:Monkey">
<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 dla Image elementu i Label definiują TargetNullValue wartości (rozdzielane znakami pojedynczego cudzysłowu), 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.
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.
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ą:
W związku z tym w tym przykładzie Image obiekty i Label wyświetlają obiekty TargetNullValue , gdy ich obiekty źródłowe to null
.
Ważne
Formatowanie ciągu nie jest stosowane w wyrażeniu powiązania, gdy właściwość jest ustawiona TargetNullValue .
Porównanie wartości TargetNullValue i FallbackValue
Obie TargetNullValue metody i FallbackValue są używane w powiązaniach danych do obsługi scenariuszy, w których powiązana wartość jest null
lub gdy powiązanie kończy się niepowodzeniem. Wiedza o tym, kiedy należy używać każdego z nich, pomaga zapewnić bezproblemowe środowisko użytkownika.
TargetNullValue
TargetNullValue Użyj właściwości , aby określić wartość do wyświetlenia, gdy powiązanie powiedzie się, ale właściwość powiązana to null
:
<Label Text="{Binding FirstName, TargetNullValue='No name available'}" />
W tym przykładzieLabel, jeśli FirstName
jest wyświetlany null
komunikat "Brak dostępnej nazwy".
FallbackValue
FallbackValue Użyj właściwości , aby podać wartość, gdy proces powiązania zakończy się niepowodzeniem, na przykład nieprawidłową ścieżką lub brakiem kontekstu powiązania:
<Label Text="{Binding FirstName, FallbackValue='Binding failed'}" />
W tym przykładzie, jeśli powiązanie zakończy się niepowodzeniem, Label zostanie wyświetlony komunikat "Powiązanie nie powiodło się".
Łączne użycie
Właściwości TargetNullValue i FallbackValue można połączyć w jednym wyrażeniu powiązania:
<Label Text="{Binding FirstName, TargetNullValue='No name available', FallbackValue='Binding failed'}" />