2011-09-02 33 views
4

在設計時,我有一些虛假錯誤,似乎是由於WPF無法在不實際運行它們的情況下估計事物的價值。這當然在運行時完美無瑕。 問題是如何擺脫這些錯誤?WPF - 如何擺脫錯誤的設計時間錯誤

下面是一個例子:

我在一個類中有以下兩種:

public static bool IsHubb {get; set;} 
public static bool IsEC { get { return !IsHubb; } } 

下轉換器工作得很好:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (HubbCostOfferPage.IsHubb && HubbCostOfferPage.CarObj.TestApprovedDate == null) 
      return Visibility.Visible; 
     else 
      return Visibility.Collapsed; 
    } 

的不過以下(雖然很相似)給出了「未設置對象實例的對象引用」。錯誤,這意味着我可以在設計時沒有看到註釋掉的靜態資源定義的唯一事情是一個很大的錯誤:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    if (HubbCostOfferPage.IsEC == true && HubbCostOfferPage.CarObj.TestApprovedDate == null) 
     return Visibility.Visible; 
    else 
     return Visibility.Collapsed; 
} 

如果我HubbCostOfferPage.IsHubb取代HubbCostOfferPage.IsEC,一切工作正常,所以我知道,有問題在哪裏。

如果將HubbCostOfferPage.IsEC替換爲轉換器中的!HubbCostOfferPage.IsHubb,則會出現同樣的問題。設計師似乎抱怨,因爲它無法評估「!」在設計時間。

任何想法如何使這項工作在設計時間以及?

回答

2

基於保羅答案我建議不檢查是CarObj爲空,因爲在運行時應該拋出異常。

我建議改變你的轉換器如下:

public object Convert(object value, Type targetType, object parameter, 
    System.Globalization.CultureInfo culture) 
{ 
    if (ApplicationIsInDesignMode) { return Visibility.**WHATEVER YOU LIKE ***; } 
    if (HubbCostOfferPage.IsEC == true && HubbCostOfferPage.CarObj.TestApprovedDate == null) 
    return Visibility.Visible; 
else 
    return Visibility.Collapsed; 
} 

private static bool ApplicationIsInDesignMode 
    { 
     get { return (bool)(DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue); } 
    } 
+0

你能澄清你在運行時拋出的異常嗎?我很好奇爲什麼你認爲檢查null會在運行時導致異常。 –

+0

@Paul:在設計時,一些對象可能爲空,因爲Factory或其他東西沒有被調用,所以屬性爲null。我認爲這沒關係。但是在運行時,屬性不能爲空。所以我相信這不是負責檢查這個的轉換器。但是當然可能有一些情況下,對象可以爲空,並且轉換器不會拋出異常。 – WaltiD

+0

偉大的解決方案。謝謝你太多了! :-) – Keren

1

關掉設計師 - 這比它的價值更麻煩。將.xaml文件與代碼編輯器相關聯(右鍵單擊,打開並設置爲默認),您將獲得更快的體驗,並且仍然具有Intellisense。您可以在需要時使用Blend。

+0

這並不完全回答這個問題,但它是在普通 –

+0

的情況下,我更喜歡這個最好的建議:工具/選項/文本編輯器/ XAML /雜項 - >「總是在完整的XAML視圖中打開文檔」選中 – UrbanEsc

+0

@UrbanEsc:你有沒有試過我的建議?它*方式*更快。 –

0
public object Convert(/*snipped*/) 
{ 
#if DEBUG 
    if (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv") 
     return Visibility.Visible; 
#endif 
    if (HubbCostOfferPage.IsEC == true && HubbCostOfferPage.CarObj.TestApprovedDate == null) 
     return Visibility.Visible; 
    else 
     return Visibility.Collapsed; 
} 

編輯:乍一看,設計師可能會抱怨,因爲HubbCostOfferPage.CarObj爲空。您也可以通過更改代碼來解決此問題:

public object Convert(/*snipped*/) 
{ 
    if (HubbCostOfferPage.IsEC && 
     HubbCostOfferPage.CarObj != null && 
     HubbCostOfferPage.CarObj.TestApprovedDate == null) 
     return Visibility.Visible; 
    else 
     return Visibility.Collapsed; 
} 

哪一個會產生更好的生產代碼的副作用。響應您的評論

第二個編輯,因爲這需要代碼:

As I wrote, replacing the IsEC with the IsHubb solves the problem and putting an ! before IsEC causes it, so it is absolutely not the CarObj that is the problem.

在啓動時,IsHubb被初始化爲假。 C#短路布爾邏輯,所以在下面的:

if (HubbCostOfferPage.IsHubb && ... 

一切之後的邏輯和是NOT被評估。當您將代碼更改爲:

if (HubbCostOfferPage.IsEC == true && ... 

現在正在評估&&之後的所有內容。整體類型如bool不會成爲「未設置爲對象實例的對象引用」的目標,並且顯然HubbCostOfferPage不爲空,所以可能的罪魁禍首是CarObj。沒有看到你的代碼,這只是一個建議的想法。

至於你的問題的第二部分,DEBUG指令只是編譯出設計者在發佈模式下編譯時檢查的代碼。如果您在發佈模式下進行任何設計時間編輯,則可以將其刪除。你需要的部分是中間的一切。

+0

正如我寫的,用IsHubb代替IsEC解決了這個問題,並且在IsEC導致它失敗之後,所以它絕對不是CarObj的問題,因此第二種解決方案將無濟於事。 你的第一個解決方案 - 我不知道我是否正確:如果我正在使用該項目並使用Debug進行編譯,是不是說Debug是將要執行的部分?在這種情況下,它不能解決這個問題在運行應用程序的時候會出現問題 – Keren

+0

我編輯了我的答案,以便更全面地回答問題,但是任一代碼都可以爲你工作 –

+0

感謝您抽出寶貴時間回答。很多感覺,這正是爲什麼這個問題困擾我很多的原因。 我已經完全從轉換器中取出了ObjCar,只是爲了檢查是否有任何機會,你是正確的關於我但可悲 - 你錯了。這與CarObj沒有任何關係:即使在轉換器中甚至沒有提到CarObj,但是一旦IsEC消失就會消失,錯誤仍然存​​在。這是非常奇怪的,因爲你對它的正確性甚至不能爲空。 – Keren