C# 数据绑定到最初为空的对象

C# 数据绑定到最初为空的对象,c#,wpf,mvvm,data-binding,C#,Wpf,Mvvm,Data Binding,我有一个Camera对象,该对象具有名称、SensorWidth、SensorHeight等属性。我想将这些属性绑定到UI,但Camera在应用程序启动时为空(用户可以选择任何相机)。仅当打开摄影机时,摄影机对象才会初始化(并加载其所有属性) 有没有办法在XAML中设置数据绑定,以便在初始化对象时开始工作 我可以在打开相机后在C#-设置数据绑定中轻松完成这项工作,但这必须在“视图代码隐藏”中完成,这可能不利于我使用的MVVM模式,因为打开相机的按钮使用命令界面与ViewModel通信 正确处理这

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

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

我可以在打开相机后在C#-设置数据绑定中轻松完成这项工作,但这必须在“视图代码隐藏”中完成,这可能不利于我使用的MVVM模式,因为打开相机的按钮使用命令界面与ViewModel通信

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

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

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

也就是说,了解
绑定
何时成功生成值非常有用:

  • 绑定源的路径已成功解析
  • 值转换器(如果有)能够转换结果值
  • 结果值对绑定目标(target)属性有效
  • 如果(1)和(2)无法生成有效值,则绑定将生成目标属性的默认值。如果要指定在这种情况下使用的替代值,可以在绑定上提供一个
    FallbackValue

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

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

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

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

    也就是说,了解
    绑定
    何时成功生成值非常有用:

  • 绑定源的路径已成功解析
  • 值转换器(如果有)能够转换结果值
  • 结果值对绑定目标(target)属性有效
  • 如果(1)和(2)无法生成有效值,则绑定将生成目标属性的默认值。如果要指定在这种情况下使用的替代值,可以在绑定上提供一个
    FallbackValue

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


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

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