系結後援
有時,資料繫結會因為無法解析繫結來源,或繫結成功但卻傳回 null
值而失敗。 雖然這些情況都可以透過值轉換器或其他額外程式碼來處理,但您可以藉由定義繫結程序失敗時要使用的後援值,讓資料繫結更穩固。 在 .NET 多平臺應用程式 UI (.NET MAUI) 應用程式中,這可藉由在系結表達式中定義 FallbackValue 和 TargetNullValue 屬性來完成。 由於這些屬性位於 類別中 BindingBase ,因此可以搭配系結、多重系結、編譯的 Binding
系結以及標記延伸使用。
注意
您可以選擇性地使用繫結運算式中的 FallbackValue 和 TargetNullValue 屬性。
定義後援值
FallbackValue 屬性可讓您定義在無法解析繫結「來源」時要使用的後援值。 設定這個屬性的常見案例是:當您要繫結之來源屬性並未存在於異質類型繫結集合中的所有物件時。
下列範例示範如何設定 FallbackValue 屬性:
<Label Text="{Binding Population, FallbackValue='Population size unknown'}"
... />
上的 Label 系結會 FallbackValue 定義值(以單引號字元分隔),如果無法解析系結來源,則會在目標上設定。 因此,如果繫結物件上不存在 Population
屬性,即會顯示 FallbackValue 屬性所定義的值。
建議您將 FallbackValue 屬性值定義為 ResourceDictionary 中的資源,而不是定義為內嵌。 這種方法的優點是這類值在單一位置中只會定義一次,並更容易進行當地語系化。 接著,即可使用 StaticResource
標記延伸來擷取資源:
<Label Text="{Binding Population, FallbackValue={StaticResource populationUnknown}}"
... />
注意
您無法使用繫結運算式來設定 FallbackValue 屬性。
若繫結運算式未設定 FallbackValue 屬性,且未解析繫結路徑或部分路徑時,會在目標上設定 BindableProperty.DefaultValue
。 不過,當 FallbackValue 屬性設定且系結路徑或路徑的一部分未解析時,就會在目標上設定 value FallbackValue 屬性值:
因此,在此範例中, Label 顯示「母體大小未知」,因為系結物件缺少 Population
屬性。
重要
設定 FallbackValue 屬性時,繫結運算式不會執行已定義的值轉換器。
定義 Null 取代值
TargetNullValue 屬性可讓您定義在已解析繫結「來源」但值為 null
時要使用的取代值。 設定這個屬性的常見案例是:當您要繫結的來源屬性可能是繫結集合中的 null
時。
下列範例示範如何設定 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>
和 Label 上的Image系結都會定義TargetNullValue值(以單引號字元分隔),如果系結路徑傳null
回 ,則會套用這個值。 因此,針對集合中未定義 ImageUrl
和 Location
屬性的任何物件,即會顯示 TargetNullValue 屬性所定義的值。
建議您將 TargetNullValue 屬性值定義為 ResourceDictionary 中的資源,而不是定義為內嵌。 這種方法的優點是這類值在單一位置中只會定義一次,並更容易進行當地語系化。 接著,即可使用 StaticResource
標記延伸來擷取資源:
<Image Source="{Binding ImageUrl, TargetNullValue={StaticResource fallbackImageUrl}}"
... />
<Label Text="{Binding Location, TargetNullValue={StaticResource locationUnknown}}"
... />
注意
您無法使用繫結運算式來設定 TargetNullValue 屬性。
當繫結運算式未設定 TargetNullValue 屬性時,會轉換 null
的來源值 (如果已定義值轉換器),並加以格式化 (如果已定義 StringFormat
),然後在目標上設定結果。 不過,設定 屬性時TargetNullValue,如果已定義值轉換器,而且仍在null
轉換之後,就會轉換 的來源值null
,並在目標上設定屬性的值TargetNullValue:
因此,在此範例中, Image 和 Label 物件會在來源物件為 null
時顯示它們TargetNullValue。
重要
若已設定 TargetNullValue 屬性,字串格式就不會套用到繫結運算式中。
TargetNullValue 和 FallbackValue 比較
和 FallbackValue 都TargetNullValue用於數據系結來處理系結值為 null
或系結失敗的案例。 瞭解何時使用,有助於確保順暢的用戶體驗。
TargetNullValue
TargetNullValue使用 屬性可指定值,以在系結成功但系結屬性為 null
時顯示:
<Label Text="{Binding FirstName, TargetNullValue='No name available'}" />
在此範例中,如果 FirstName
為 null
, Label 則會顯示 「沒有名稱可用」。
FallbackValue
當 FallbackValue 系結程式完全失敗時,請使用 屬性來提供值,例如不正確的路徑或遺漏的系結內容:
<Label Text="{Binding FirstName, FallbackValue='Binding failed'}" />
在此範例中,如果系結失敗 Label ,將會顯示「系結失敗」。
合併使用
TargetNullValue和 FallbackValue 屬性可以在單一系結運算式中合併:
<Label Text="{Binding FirstName, TargetNullValue='No name available', FallbackValue='Binding failed'}" />