为什么Silverlight View不会抛出空异常?

时间:2015-06-04 17:46:45

标签: c# silverlight

给定具有以下绑定的Silverlight视图:

<TextBox Width="200" Text="{Binding Customer.FirstName, Mode=TwoWay}"/>

后面的代码如下:

CustomerClass Customer {get; set;}

这不会引发NullReferenceException但是以下

String FirstName 
{
    get { return Customer.FirstName; }
}

当我尝试绑定到FirstName而不是Customer.FirstName时,为什么会这样,以及如何纠正? (不仅仅是直接绑定到Customer.FirstName或初始化CustomerClass对象)

编辑:解决可能的重复问题。我认为绑定仍然试图在视图首次初始化时获得引用,是不是这种情况?如果是这样,那么我可以看到获取引用和在视图时间绑定之间的区别

2 个答案:

答案 0 :(得分:2)

  

我认为绑定仍然试图在首次初始化视图时获取引用,是不是这样?

绑定过程旨在处理空值,并将检查给定的初始目标引用,如果为null则不尝试任何操作。 记住绑定只是指定路径/​​位置的反射过程,而不是实际提取值。

当绑定发现位置正试图反映其中typedef enum : NSInteger { UIStatusBarStyleDefault, UIStatusBarStyleLightContent, UIStatusBarStyleBlackTranslucent, UIStatusBarStyleBlackOpaque } UIStatusBarStyle; // @implementation ViewController - (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; } @end 为空时,它会在那里停止。

但是当它被赋予Customer.FirstName的绑定时,绑定的位置 引用非常有效。答对了!然后,当绑定之后的最终操作提取值时,调用FirstName,最终会抛出异常,因为getterCustomer为空。< / p>

  

怎么能纠正这个?

考虑使用TargetNullValue添加绑定,这是一个在null时使用的备用绑定。或者在绑定为空时直接提供FallbackValue使用。

或者将GUI设计为不依赖于可能为null的对象的子属性。

答案 1 :(得分:1)

XAML绑定不会抛出NullReferenceException,但它们也不会捕获属性getter抛出的异常。在某些“风格”中,如WPF,有扩展的绑定属性,如FallbackValueTargetNullValue。 (我不确定Silverlight中支持多少。)

当绑定失败时,将写入跟踪警告消息,但不会抛出异常。

在第一种情况下,评估属性getter并返回null

在第二种情况下,会对属性getter进行求值,但由于异常,无法将值返回给绑定系统。

要更正它,只需检查getter中的null并返回默认值,如果是这样的话:

string FirstName 
{
    get { return Customer == null ? string.Empty : Customer.FirstName; }
}