给定具有以下绑定的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
对象)
编辑:解决可能的重复问题。我认为绑定仍然试图在视图首次初始化时获得引用,是不是这种情况?如果是这样,那么我可以看到获取引用和在视图时间绑定之间的区别
答案 0 :(得分:2)
我认为绑定仍然试图在首次初始化视图时获取引用,是不是这样?
绑定过程旨在处理空值,并将检查给定的初始目标引用,如果为null则不尝试任何操作。 记住绑定只是指定路径/位置的反射过程,而不是实际提取值。
当绑定发现位置正试图反映其中typedef enum : NSInteger {
UIStatusBarStyleDefault,
UIStatusBarStyleLightContent,
UIStatusBarStyleBlackTranslucent,
UIStatusBarStyleBlackOpaque
} UIStatusBarStyle;
//
@implementation ViewController
- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent;
}
@end
为空时,它会在那里停止。
但是当它被赋予 怎么能纠正这个? 考虑使用TargetNullValue添加绑定,这是一个在null时使用的备用绑定。或者在绑定为空时直接提供FallbackValue使用。 或者将GUI设计为不依赖于可能为null的对象的子属性。Customer.FirstName
的绑定时,绑定的位置 引用非常有效。答对了!然后,当绑定之后的最终操作提取值时,调用FirstName
,最终会抛出异常,因为getter
或Customer
为空。< / p>
答案 1 :(得分:1)
XAML绑定不会抛出NullReferenceException
,但它们也不会捕获属性getter抛出的异常。在某些“风格”中,如WPF,有扩展的绑定属性,如FallbackValue
和TargetNullValue
。 (我不确定Silverlight中支持多少。)
当绑定失败时,将写入跟踪警告消息,但不会抛出异常。
在第一种情况下,评估属性getter并返回null
。
在第二种情况下,会对属性getter进行求值,但由于异常,无法将值返回给绑定系统。
要更正它,只需检查getter中的null
并返回默认值,如果是这样的话:
string FirstName
{
get { return Customer == null ? string.Empty : Customer.FirstName; }
}