共用方式為


Xamarin.Forms 系結後援

有時,資料繫結會因為無法解析繫結來源,或繫結成功但卻傳回 null 值而失敗。 雖然這些情況都可以透過值轉換器或其他額外程式碼來處理,但您可以藉由定義繫結程序失敗時要使用的後援值,讓資料繫結更穩固。 您可以在繫結運算式中定義 FallbackValueTargetNullValue 屬性來完成上述作業。 由於這些屬性位於 類別中 BindingBase ,因此可以搭配系結、多重系結、編譯的 Binding 系結以及標記延伸使用。

注意

您可以選擇性地使用繫結運算式中的 FallbackValueTargetNullValue 屬性。

定義後援值

FallbackValue 屬性可讓您定義在無法解析繫結「來源」時要使用的後援值。 設定這個屬性的常見案例是:當您要繫結之來源屬性並未存在於異質類型繫結集合中的所有物件時。

MonkeyDetail 頁面說明如何設定 FallbackValue 屬性:

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

Label 上的繫結可定義當無法解析繫結來源時要在目標上設定的 FallbackValue 值。 因此,如果繫結物件上不存在 Population 屬性,即會顯示 FallbackValue 屬性所定義的值。 請注意,這裡的 FallbackValue 屬性值會以單引號字元分隔。

建議您將 FallbackValue 屬性值定義為 ResourceDictionary 中的資源,而不是定義為內嵌。 這種方法的優點是這類值在單一位置中只會定義一次,並更容易進行當地語系化。 接著,即可使用 StaticResource 標記延伸來擷取資源:

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

注意

您無法使用繫結運算式來設定 FallbackValue 屬性。

以下是程式執行情況:

FallbackValue 系結

若繫結運算式未設定 FallbackValue 屬性,且未解析繫結路徑或部分路徑時,會在目標上設定 BindableProperty.DefaultValue。 不過,若已設定 FallbackValue 屬性,但未解析繫結路徑或部分路徑時,則會在目標上設定 FallbackValue 值屬性的值。 因此,MonkeyDetail 頁面中的 Label 會顯示 "Population size unknown" (母體大小未知),因為繫結物件缺少 Population 屬性。

重要

設定 FallbackValue 屬性時,繫結運算式不會執行已定義的值轉換器。

定義 Null 取代值

TargetNullValue 屬性可讓您定義在已解析繫結「來源」但值為 null 時要使用的取代值。 設定這個屬性的常見案例是:當您要繫結的來源屬性可能是繫結集合中的 null 時。

Monkeys 頁面說明如何設定 TargetNullValue 屬性:

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

ImageLabel 上的繫結均可定義當繫結路徑傳回 null 時要套用的 TargetNullValue 值。 因此,針對集合中未定義 ImageUrlLocation 屬性的任何物件,即會顯示 TargetNullValue 屬性所定義的值。 請注意,這裡的 TargetNullValue 屬性值會以單引號字元分隔。

建議您將 TargetNullValue 屬性值定義為 ResourceDictionary 中的資源,而不是定義為內嵌。 這種方法的優點是這類值在單一位置中只會定義一次,並更容易進行當地語系化。 接著,即可使用 StaticResource 標記延伸來擷取資源:

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

注意

您無法使用繫結運算式來設定 TargetNullValue 屬性。

以下是程式執行情況:

TargetNullValue 系結

當繫結運算式未設定 TargetNullValue 屬性時,會轉換 null 的來源值 (如果已定義值轉換器),並加以格式化 (如果已定義 StringFormat),然後在目標上設定結果。 不過,若已設定 TargetNullValue 屬性,則會轉換 null 的來源值 (如果已定義值轉換器);如果轉換後仍為 null,就會在目標上設定 TargetNullValue

重要

若已設定 TargetNullValue 屬性,字串格式就不會套用到繫結運算式中。