相关文章推荐
从容的打火机  ·  ApplicationFactory.Get ...·  5 月前    · 
安静的黄豆  ·  Command line tool ...·  10 月前    · 

有时数据绑定会失败,因为无法解析绑定源,或者因为绑定成功但返回 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 设置了 属性并且未解析绑定路径或路径的一部分时, FallbackValue 将在目标上设置 value 属性的值:

因此,在此示例中, Label 显示“人口大小未知”,因为绑定对象缺少 Population 属性。

当设置了 FallbackValue 时,则不会执行绑定表达式中的已定义的值转换器。

定义 null 替换值

属性 TargetNullValue 允许定义将在解析绑定 时使用的替换值,但值为 null。 设置此属性的常见方案是绑定到绑定集合中可能为 null 的源属性。

以下示例演示如何设置 TargetNullValue 属性:

<ListView ItemsSource="{Binding Monkeys}"
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                    <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时将应用这些值。 因此,将为集合中未定义 ImageUrlLocation 属性的任何对象显示由 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

因此,在此示例中, ImageLabel 对象的源对象为 null时显示其 TargetNullValue

设置了 TargetNullValue 属性时,将不会在绑定表达式中应用字符串格式设置。