我有一个使用itemTemplate的listBox,其中包含以下行:
<Image Source="{Binding MyProperty.PossiblyNullObject.UrlProperty}"/>
绑定到此listBox是一个模型视图集合,它在单独的线程上加载集合中项目的组件。当组合引擎首次呈现xaml代码时,'PossiblyNullObject'可能不会设置为值。
WPF如何处理这个问题?它是否使用默认值(没有图像源,因此没有图像)并继续?它等了吗?它是否会自动检测值何时初始化并使用新源重新呈现?它是如何以与我以编程方式调用'MyProperty.PossiblyNullObject.UrlProperty'相同的方式抛出对象空异常?当我尝试调用它时,如何在我自己的代码中重现此功能?
感谢您的任何建议。我对WPF很尴尬,我正试图解决一个问题。图像加载是一个性能问题所以我找到了一个解决方案来加载,解码,然后冻结后台线程上的图像源,这样它就不会锁定UI。不幸的是,当我尝试使用调用相同属性的解决方案替换图像源绑定时,我遇到了这个空异常问题。 WPF以某种方式处理可能的null对象,我想以同样的方式保持清洁。
答案 0 :(得分:22)
在BindingBase
中有两个属性:TargetNullValue
和FallbackValue
。
TargetNullValue
会返回您的值。
FallbackValue
将返回您的值。
使用示例:
<!-- xmlns:sys="clr-namespace:System;assembly=mscorlib" -->
<Window.Resources>
<!-- Test data -->
<local:TestDataForImage x:Key="MyTestData" />
<!-- Image for FallbackValue -->
<sys:String x:Key="ErrorImage">pack://application:,,,/NotFound.png</sys:String>
<!-- Image for NULL value -->
<sys:String x:Key="NullImage">pack://application:,,,/NullImage.png</sys:String>
</Window.Resources>
<Grid DataContext="{StaticResource MyTestData}">
<Image Name="ImageNull"
Width="100"
Height="100"
Source="{Binding Path=NullString, TargetNullValue={StaticResource NullImage}}" />
<Image Name="ImageNotFound"
Width="100"
Height="100"
Source="{Binding Path=NotFoundString, FallbackValue={StaticResource ErrorImage}}" />
</Grid>
有关详细信息,请参阅此链接: