【问题标题】:How does WPF handle binding to the property of a null object?WPF 如何处理对空对象属性的绑定?
【发布时间】:2014-01-30 18:15:56
【问题描述】:

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

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

绑定到此列表框的是一个模型视图集合,它在单独的线程上加载集合中项目的组件。组合引擎首次呈现 xaml 代码时,可能不会将“PossiblyNullObject”设置为值。

WPF 如何处理这个问题?它是否使用默认值(没有图像源所以没有图像)并继续?它等待吗?它是否会自动检测值何时初始化并使用新源重新呈现?如果我以编程方式调用“MyProperty.PossiblyNullObject.UrlProperty”,它如何不抛出对象空异常?当我尝试调用它时,如何在我自己的代码中重现此功能?

感谢您的任何建议。我对 WPF 来说是个令人尴尬的新手,我正试图解决我无法解决的问题。图像加载是一个性能问题,所以我找到了一个解决方案来加载、解码,然后在后台线程上冻结图像源,这样它就不会锁定 UI。不幸的是,当我尝试用调用相同属性的解决方案替换图像源绑定时遇到了这个空异常问题。 WPF 以某种方式处理可能的空对象,我想以同样的方式来保持干净。

【问题讨论】:

  • Binding 中有属性:TargetNullValueFallbackValue。当源的值为 null 时,第一个返回您的值。当绑定无法返回值时,第二个返回您的值。适合你吗?
  • 谢谢阿纳托利。这给了我足够的时间开始研究。
  • 你不介意,如果我写这个作为答案并且你接受了吗?谢谢。
  • 是的,我会接受这个答案。

标签: wpf multithreading xaml properties null


【解决方案1】:

BindingBase 中有两个属性:TargetNullValueFallbackValue

TargetNullValue 在源值为 null 时返回您的值。

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

【讨论】:

  • 我一直在寻找一种机制,如 XAML 的空传播(如在 C# 6.0 中),但很难找到如何阐明问题以找到它。值得注意的是,如果使用了“FallBackValue”,转换器将不会执行。
  • 如何在命令绑定中使用FallbackValue?以下内容似乎不起作用:&lt;Button Command="{Binding ActiveDrawing.PrintBatchCommand, FallbackValue={x:Null}}" /&gt;。如果ActiveDrawing 为空,我希望禁用该按钮。
  • 我也发了question,如果你想回答:
  • > 值得注意的是,如果使用'FallBackValue',转换器将不会执行。谢谢@Gui,这让我很头疼。我在争论是否必须重写一整套可见性转换器。
  • 如果没有设置这些属性会怎样?会返回空值吗?还是后台异常?我将不胜感激有关此主题的答案更新。谢谢!
猜你喜欢
  • 2020-04-01
  • 2021-05-09
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多