WPF如何处理绑定到空对象的属性?

az31mfrm  于 2022-11-18  发布在  其他
关注(0)|答案(2)|浏览(293)

我有一个使用itemTemplate的listBox,其中包含以下行:

<Image Source="{Binding MyProperty.PossiblyNullObject.UrlProperty}"/>

绑定到此listBox得是一个模型视图集合,该集合在单独得线程上加载集合中项得组件.当撰写引擎首次呈现xaml代码时,不能将“PossiblyNullObject”设置为值.
WPF如何处理此问题?它是否使用默认值(没有图像源,所以没有图像)并继续?它是否等待?它是否自动检测值何时初始化并使用新的源重新呈现?它如何不抛出对象空异常,就像我以编程方式调用'MyProperty.PossiblyNullObject.UrlProperty'一样?当我尝试调用它时,如何在我自己的代码中重现此功能?
谢谢你的建议。我是WPF的新手,我正在尝试解决一个我无法解决的问题。图像加载是一个性能问题,所以我找到了一个解决方案,在后台线程上加载、解码,然后冻结图像源,这样它就不会锁定UI。不幸的是,当我尝试用调用相同属性的解决方案替换图像源绑定时,遇到了这个null异常问题。WPF以某种方式处理可能的空对象,我想以同样的方式来保持干净。

brccelvz

brccelvz1#

BindingBase中有两个属性:TargetNullValueFallbackValue中的一个或多个。
当source的值为 null 时,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>

有关详细信息,请参阅以下链接:
BindingBase.TargetNullValue Property
BindingBase.FallbackValue Property

esbemjvw

esbemjvw2#

注:投票通过并被接受的答案并不能回答问题;它解释了如果Anull,如何使{Binding A}工作,这是一个很容易处理的问题,但是它没有解释当Anull时会发生什么,以及如何处理{Binding A.B}这个更有趣的情况,而这正是问题所要问的。下面是问题的答案***如上所述***。
WPF通常处理在绑定中使用A.BA为null的情况;我还没有具体尝试过<Image Source>,但我已经尝试过<DataGrid ItemsSource><Button Command>
当WPF处理这些情况时,我观察到输出窗口中没有出现错误或警告,应用程序出现了一些故障,但没有崩溃:

  • <DataGrid ItemsSource>的情况下,DataGrid显示为空。
  • <Button Command>的情况下,按钮是可单击的,但是当您单击它时,没有任何React。
  • <Image Source>的情况下,我希望不会出现图像。

(Note所有这些都是***无声的失败***,所以无论谁决定WPF应该这样做,都应该在中心广场被行刑队枪杀,伴随着盛大的庆祝活动、现场音乐和巨大的赠品。)
我们通常处理这些情况的方式取决于手头元素的性质。

  • 对于图像,如果空图像是可接受的,则不需要执行任何操作。如果某些图像必须显示,而属性为空,则接受的答案可能提供了解决方案。
  • 对于网格,当属性为null时不显示任何内容可能是所需的行为。
  • 对于按钮,解决方案是使用按钮的IsEnabled属性的附加绑定。

例如:

<Button Command="{Binding A.B}" IsEnabled="{Binding HasA}"/>

其中HasA在视图模型中定义如下:

bool HasA => A != null;

相关问题