2013-02-19 60 views
0

我在我的代碼中有不少字典綁定。他們大多數沒有找到並使用FallBackValue。字典比可以返回DependencyProperty.UnsetValue

這一切都對用戶很有用。

但是,當我在調試器中運行它時,需要很長時間才能在輸出窗口中顯示所有這些錯誤。

我問了這個問題WPF Dictionary Binding failure is very slow並被告知我應該返回DependencyProperty.UnsetValue。

我試過了,編譯完成。但是當我運行它時,我得到一個異常。

有什麼方法可以定義一個字典,也可以返回DependencyProperty.UnsetValue?(或其他方式失敗得更快。)

更新:這是一個迭代我的嘗試:

public class NullTolerantDictionary<TKey, TValue> 
      : Dictionary<TKey, TValue> where TValue : class 
{ 
    public new TValue this[TKey key] 
    { 
     get 
     { 
      TValue value; 
      bool success = TryGetValue(key, out value); 
      if (success) 
       return value; 

      var errorResult = DependencyProperty.UnsetValue as TValue; 

      if (errorResult != null) 
       return errorResult; 

      return default(TValue); 
     } 
    }   
} 

回答

1

UnsetValue有對象的運行時類型,所以errorResult將是空的任何其他TValue類型,並且default(TValue)也爲空。所以最後,當鍵值丟失時,通常返回null,而不是拋出適當的異常。這與IDictionary合約相反,這就是事情沒有解決的原因。本質上,你的類看起來像一個真正的IDictionary(即它實現了IDictionary),但它不是真正的一個(即它不像一個)。你不會說在運行時得到了什麼異常,但我認爲這是一個來自客戶端代碼的NullReferenceException,它並不期望你的方法調用返回null。

您基本上試圖在現有代碼中將dict[key]重寫爲dict.TryGetValue(key)。我可以同情動機,但這是行不通的。它必須從呼叫方進行修復,聽起來你無法控制這一點。