我有一个使用itemTemplate的listBox,其中包含以下行:
<Image Source="{Binding MyProperty.PossiblyNullObject.UrlProperty}"/>
绑定到此listBox得是一个模型视图集合,该集合在单独得线程上加载集合中项得组件.当撰写引擎首次呈现xaml代码时,不能将“PossiblyNullObject”设置为值.
WPF如何处理此问题?它是否使用默认值(没有图像源,所以没有图像)并继续?它是否等待?它是否自动检测值何时初始化并使用新的源重新呈现?它如何不抛出对象空异常,就像我以编程方式调用'MyProperty.PossiblyNullObject.UrlProperty'一样?当我尝试调用它时,如何在我自己的代码中重现此功能?
谢谢你的建议。我是WPF的新手,我正在尝试解决一个我无法解决的问题。图像加载是一个性能问题,所以我找到了一个解决方案,在后台线程上加载、解码,然后冻结图像源,这样它就不会锁定UI。不幸的是,当我尝试用调用相同属性的解决方案替换图像源绑定时,遇到了这个null异常问题。WPF以某种方式处理可能的空对象,我想以同样的方式来保持干净。
2条答案
按热度按时间brccelvz1#
在
BindingBase
中有两个属性:TargetNullValue
和FallbackValue
中的一个或多个。当source的值为 null 时,
TargetNullValue
会传回您的值。FallbackValue
会在系结无法传回值时传回您的值。使用示例:
有关详细信息,请参阅以下链接:
BindingBase.TargetNullValue Property
BindingBase.FallbackValue Property
esbemjvw2#
注:投票通过并被接受的答案并不能回答问题;它解释了如果
A
是null
,如何使{Binding A}
工作,这是一个很容易处理的问题,但是它没有解释当A
是null
时会发生什么,以及如何处理{Binding A.B}
这个更有趣的情况,而这正是问题所要问的。下面是问题的答案***如上所述***。WPF通常处理在绑定中使用
A.B
时A
为null的情况;我还没有具体尝试过<Image Source>
,但我已经尝试过<DataGrid ItemsSource>
和<Button Command>
。当WPF处理这些情况时,我观察到输出窗口中没有出现错误或警告,应用程序出现了一些故障,但没有崩溃:
<DataGrid ItemsSource>
的情况下,DataGrid显示为空。<Button Command>
的情况下,按钮是可单击的,但是当您单击它时,没有任何React。<Image Source>
的情况下,我希望不会出现图像。(Note所有这些都是***无声的失败***,所以无论谁决定WPF应该这样做,都应该在中心广场被行刑队枪杀,伴随着盛大的庆祝活动、现场音乐和巨大的赠品。)
我们通常处理这些情况的方式取决于手头元素的性质。
IsEnabled
属性的附加绑定。例如:
其中
HasA
在视图模型中定义如下: