[英]Why does Silverlight View not throw a null exception?
給定具有以下綁定的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
對象之外)
編輯 :解決可能的重復問題。 我以為綁定是在第一次初始化視圖時仍然嘗試獲取引用,不是這種情況嗎? 如果是這樣,那么我可以看到獲得參考與僅在查看時綁定之間的區別
我以為綁定是在第一次初始化視圖時仍然嘗試獲取引用,不是這種情況嗎?
綁定過程旨在處理空值,並將檢查給定的初始目標引用 ,如果為空則不嘗試任何操作。 請記住,綁定只是對指定路徑/位置的反射過程,而不是對值的實際提取。
當綁定發現它試圖反映的位置是Customer.FirstName
為null時,它將在那里停止。
但是,當給定FirstName
的綁定時,該綁定的位置 引用是非常有效的。 答對了! 然后,當綁定后的最終操作要提取值時,將調用getter
,該方法最終會引發異常,因為Customer
或FirstName
為null。
如何糾正呢?
考慮使用TargetNullValue添加到綁定中,這是null時要使用的備用綁定。 或在綁定為null時直接提供FallbackValue以使用。
或者將GUI設計為不依賴於可能為null的對象的子屬性。
XAML綁定本身不會拋出NullReferenceException
,但它們也不會捕獲由屬性getter拋出的異常。 在某些“風味”(如WPF)中,具有擴展的綁定屬性(如FallbackValue
和TargetNullValue
。 (我不確定Silverlight支持多少功能。)
綁定失敗時,將寫入跟蹤警告消息,但不會引發異常。
在第一種情況下,將評估屬性getter並返回null
。
在第二種情況下,將對屬性getter進行評估,但由於異常而無法將值返回到綁定系統。
要更正它,只需在getter中檢查是否為null
,如果是,則返回默認值:
string FirstName
{
get { return Customer == null ? string.Empty : Customer.FirstName; }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.