Udostępnij za pośrednictwem


Rezerwowe powiązania

Przeglądaj przykład. Przeglądanie przykładu

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:

Powiązanie FallbackValue.

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ą:

Powiązanie TargetNullValue.

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'}" />