2013-02-26 78 views
1

我試圖根據組合框的選定值顯示標籤。我正在使用VS2010。C#WPF標籤可見性異常

下面的代碼:

private void pointsSettings_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if (this.pointsSettings.SelectedValue.ToString() == "between") 
     { 
      pointsAboveLabel.Visibility = Visibility.Collapsed; 
     } 
     else 
     { 
      pointsAboveLabel.Visibility = Visibility.Visible; 
     } 
    } 

而XAML:

<ComboBox Name="pointsSettings" SelectionChanged="pointsSettings_SelectionChanged"> 
    <ComboBoxItem Content="between" /> 
    <ComboBoxItem Content="above" IsSelected="True" /> 
    <ComboBoxItem Content="below" /> 
</ComboBox> 
<Label Content="points" Name="pointsAboveLabel" /> 
<Label Content="and" Name="pointsBetweenLabel" Visibility="Collapsed" /> 

這裏是我得到的錯誤: enter image description here 文如下:未設置爲實例「對象引用一個對象「

我知道還有另一個問題非常相似 - 事實上有相同的錯誤 - 但提供的解決方案(將變量初始化移動到InitializeComponent()方法調用上方)並不適合我,因爲我有沒有對象初始化。

任何和所有的幫助最受熱烈讚賞。

+0

幾乎所有'NullReferenceException'的情況都是一樣的。請參閱「[什麼是.NET一個NullReferenceException?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net)」獲得一些提示。 – 2013-02-26 17:10:10

+0

@JohnSaunders謝謝你。我真的應該開始獨立調試,然後詢問是否需要幫助。儘管在這種情況下,我可能仍然會問,因爲我認爲事件處理程序在所有XAML執行完畢後才運行。我將書籤鏈接,我覺得它可能會派上用場...... – 2013-02-26 17:40:35

+0

注意,從@BrianS答案,下面,幾乎說什麼我的鏈接說:變量未初始化。他回答說_reason_它沒有被初始化,因爲UI還沒有初始化它。 – 2013-02-26 17:58:23

回答

5

這是因爲pointsSettings_SelectionChanged發生在UI完全初始化前(你可以在調用堆棧看到,它來自InitializeComponents()調用)。所以標籤還沒有在UI中初始化,因此您在代碼隱藏中指向該標籤的變量爲null。所以它與其他問題實際上是相同的問題,但它是初始化變量的WPF框架,而不是你。

您的XAML是按順序評估的,因此它會在ComboBox中初始化並初始化它(包括最初選定的值),並在標籤初始化之前觸發SelectionChanged事件。您會注意到,如果您更改XAML的順序,以使Label高於,ComboBox,那麼您將不會遇到問題,因爲Label將在事件觸發前初始化。

爲了解決這個問題,我建議增加一個條件到pointsSettings_SelectionChanged方法返回如果pointsAboveLabel爲null:

private void pointsSettings_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if(pointsAboveLabel == null) return; 
    //rest of code 
} 

而且因爲你是被硬編碼最初選擇的值在ComboBox,你可以硬編碼Label的初始Visibility

但是你的代碼中有另一個問題 - ComboBoxSelectedValue永遠不會是一個字符串,因爲你現在已經設置了它。 SelectedValue將是ComboBoxItem。爲了查看您要放入ComboBoxItem的字符串值,您需要查看Content屬性。所以你需要這樣的東西:

ComboBoxItem item = pointsSettings.SelectedValue as ComboBoxItem; 
if(item.Content.ToString() == "between") 
{ 
    ... 
} 
+0

非常感謝你,你的解決方案非常完美。一個簡單的問題,在XAML中,我還應該將另一個標籤(默認情況下隱藏)放在組合框上方,還是隻需要在組合框之前定義可見的默認標籤? – 2013-02-26 17:33:20

+0

我補充說,這些信息主要是爲了說明_why_這是怎麼回事。所以我的建議是從用戶體驗角度(上方或下方,無論哪種方式向用戶提供正確的體驗)將標籤放置在任何應用場合,然後調整代碼隱藏以處理該場景。我很高興這爲你工作 - 另一個建議是,你可能想看看MVVM。這有一個小小的學習曲線,但它確實是構建WPF應用程序的標準方法,並且從長遠來看使生活更加輕鬆。 – 2013-02-26 17:39:31

+0

一旦我完成了WPF的基礎知識,我會研究它。再次感謝。 – 2013-02-26 17:48:58