Fallbacks für Xamarin.Forms-Bindungen
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:
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:
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.