Udostępnij za pośrednictwem


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:

Powiązanie FallbackValue

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:

Powiązanie TargetNullValue

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 .