Fallbacks für Xamarin.Forms-Bindungen

Download Sample Das Beispiel herunterladen

Manchmal schlagen Datenbindungen fehl, weil die Bindungsquelle nicht aufgelöst werden kann oder weil eine erfolgreiche Bindung einen null-Wert zurückgibt. Während diese Szenarios mit Wertkonvertern behandelt werden können, oder einem anderen zusätzlichen Code, können Datenbindungen stabiler gemacht werden, indem Fallback-Werte festgelegt werden, die verwendet werden, wenn der Bindungsprozess fehlschlägt. Dies kann erreicht werden, indem die Eigenschaften FallbackValue und TargetNullValue in einem Bindungsausdruck definiert werden. Da sich diese Eigenschaften in der BindingBase-Klasse befinden, können sie mit Bindungen, Mehrfachbindungen, kompilierten Bindungen und mit der Markuperweiterung Binding verwendet werden.

Hinweis

Die Verwendung der Eigenschaften FallbackValue und TargetNullValue in einem Bindungsausdruck ist optional.

Definieren von Fallbackwerten

Durch die Eigenschaft FallbackValue kann ein Fallbackwert definiert werden, der verwendet wird, wenn die Bindung Quelle nicht gelöst werden kann. Ein häufiges Szenario zur Einstellung dieser Eigenschaft ist die Bindung an Quelleigenschaften, die möglicherweise nicht für alle Objekte in einer gebundenen Sammlung heterogener Typen vorhanden sind.

Auf der Seite MonkeyDetail (Affe Details) wird das Festlegen der FallbackValue-Eigenschaft veranschaulicht:

<Label Text="{Binding Population, FallbackValue='Population size unknown'}"
       ... />   

Die Bindung auf der Label definiert einen FallbackValue-Wert, der auf das Ziel festgelegt wird, wenn die Bindungsquelle nicht gelöst werden kann. Deshalb wird der durch die FallbackValue-Eigenschaft definierte Wert angezeigt, falls die Population-Eigenschaft nicht auf dem gebundenen Objekt vorhanden ist. Beachten Sie, dass hier der FallbackValue-Eigenschaftswert durch einfache Anführungszeichen (Apostrophe) getrennt ist.

Anstatt FallbackValue-Eigenschaftswerte inline zu definieren, wird empfohlen, diese als Ressourcen in einer ResourceDictionary zu definieren. Der Vorteil dieses Ansatzes ist, dass solche Werte einmal an einem einzigen Speicherort definiert werden und einfacher lokalisierbar sind. Die Ressourcen können dann mithilfe der StaticResource-Markuperweiterung abgerufen werden:

<Label Text="{Binding Population, FallbackValue={StaticResource populationUnknown}}"
       ... />  

Hinweis

Es ist nicht möglich, die FallbackValue-Eigenschaft mit einem Bindungsausdruck festzulegen.

Dies ist das Programm, das ausgeführt wird:

FallbackValue Binding

Wenn die FallbackValue-Eigenschaft nicht in einem Bindungsausdruck festgelegt ist, und der Bindungspfad oder Teil des Pfads nicht gelöst wurde, wird BindableProperty.DefaultValue auf das Ziel festgelegt. Wenn die FallbackValue-Eigenschaft jedoch festgesetzt wird und der Bindungspfad oder Teil des Pfads nicht gelöst wurde, wird der Wert der FallbackValue-Werteigenschaft auf das Ziel festgelegt. Deshalb wird auf der Seite MonkeyDetail (Affe Details) vom Label „Population size unknown“ (Populationsgröße unbekannt) angezeigt, weil dem gebundenen Objekt eine Population-Eigenschaft fehlt.

Wichtig

Ein definierter Wertkonverter wird in einem Bindungsausdruck nicht ausgeführt, wenn die FallbackValue-Eigenschaft festgelegt ist.

Definieren von NULL-Ersatzwerten

Durch die TargetNullValue-Eigenschaft kann ein Ersatzwert definiert werden, der verwendet wird, wenn die Bindung Quelle zwar gelöst wurde, der Wert aber null ist. Ein häufiges Szenario zum Festlegen dieser Eigenschaft ist die Bindung an Quelleigenschaften, die in einer gebundenen Sammlung null sein könnten.

Die Seite Monkeys (Affen) veranschaulicht das Festlegen der TargetNullValue-Eigenschaft:

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

Die Bindungen auf den Image und Label definieren beide TargetNullValue-Werte, die angewendet werden, wenn der Bindungspfad null zurückgibt. Daher werden die durch die TargetNullValue-Eigenschaften definierten Werte für jedes Objekt in der Sammlung angezeigt, bei dem die Eigenschaften ImageUrl und Location nicht definiert sind. Beachten Sie, dass hier die TargetNullValue-Eigenschaftswerte durch einfache Anführungszeichen (Apostrophe) getrennt sind.

Anstatt TargetNullValue-Eigenschaftswerte inline zu definieren, wird empfohlen, diese als Ressourcen in einer ResourceDictionary zu definieren. Der Vorteil dieses Ansatzes ist, dass solche Werte einmal an einem einzigen Speicherort definiert werden und einfacher lokalisierbar sind. Die Ressourcen können dann mithilfe der StaticResource-Markuperweiterung abgerufen werden:

<Image Source="{Binding ImageUrl, TargetNullValue={StaticResource fallbackImageUrl}}"
       ... />
<Label Text="{Binding Location, TargetNullValue={StaticResource locationUnknown}}"
       ... />

Hinweis

Es ist nicht möglich, die TargetNullValue-Eigenschaft mit einem Bindungsausdruck festzulegen.

Dies ist das Programm, das ausgeführt wird:

TargetNullValue Binding

Wenn die TargetNullValue-Eigenschaft nicht in einem Bindungsausdruck festgelegt ist, wird ein Quellwert von null konvertiert, falls ein Wertkonverter definiert ist, und formatiert, falls ein StringFormat definiert ist. Das Ergebnis wird dann auf das Ziel festgelegt. Wenn die TargetNullValue-Eigenschaft festgelegt ist, wird ein Quellwert von null konvertiert, falls ein Wertkonverter definiert ist, und wenn dieser nach der Konvertierung immer noch null ist, wird der Wert der TargetNullValue-Eigenschaft auf das Ziel festgelegt.

Wichtig

Zeichenfolgen werden in einem Bindungsausdruck nicht formatiert, wenn die TargetNullValue-Eigenschaft festgelegt ist.