【问题标题】:Data binding to objects which are initially null数据绑定到最初为空的对象
【发布时间】:2018-01-11 14:37:08
【问题描述】:

我有一个 Camera 对象,它具有 Name、SensorWidth、SensorHeight 等属性。我想将这些属性绑定到 UI,但 Camera 在应用程序启动时为空(用户可以选择任何相机)。只有当相机打开时,相机对象才会被初始化(并加载它的所有属性)。

有没有办法在 XAML 中设置数据绑定,以便在初始化对象时开始工作?

我可以在 C# 中轻松做到这一点 - 打开相机后设置数据绑定,但这必须在后面的查看代码中完成,这可能对我正在使用的 MVVM 模式不利,因为打开相机的按钮使用命令与 ViewModel 通信的接口。

正确处理这个问题的方法是什么?

【问题讨论】:

  • WPF 数据绑定在属性路径中的任何属性为空时都没有问题。您可以声明一个最初为 null 的 Camera 属性并像 {Binding Camera.Name} 一样绑定。您只需确保 Camera 属性触发更改通知。
  • 你说得对,当然我错过了相机属性中的事件

标签: c# wpf mvvm data-binding


【解决方案1】:

有没有办法在 XAML 中设置数据绑定,以便在初始化对象时开始工作?

绑定旨在优雅地处理空值。如果您的Camera 对象在启动时为空,应该没有问题。 WPF 期望绑定源可能为 null,并且属性路径上的任何值都可能为 null。

也就是说,了解Binding 何时成功生成值很有用:

  1. 绑定源的路径解析成功。
  2. 值转换器(如果有)能够转换结果值。
  3. 结果值对绑定目标(target)属性有效。

如果 (1) 和 (2) 未能生成有效值,则绑定将生成目标属性的默认值。如果您想指定在这种情况下使用的 alterate 值,您可以在绑定中提供 FallbackValue

在您的情况下,如果您有{Binding Camera.Name},并且Camera 为空,则绑定将无法生成值。如果您将绑定更改为{Binding Camera.Name, FallbackValue='n/a'},那么当Camera 为空时,它会生成字符串n/a

TargetNullValue 允许您在绑定确实产生有效值但该值为空的情况下指定替代值。例如,如果Camera 本身为非空,但其Name 为空,则{Binding Camera.Name, TargetNullValue='(no name)'} 将生成字符串(no name)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-28
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 2010-10-17
    • 2010-10-10
    相关资源
    最近更新 更多