2017-03-27 61 views
0

我正在開發一個C#中的WPF用戶控件庫。該庫具有用戶交互的表單。該表單有3個組合框(ComboBox1,ComboBox2和ComboBox3)。一旦用戶選擇了組合框1中的項目,那麼組合框2和3將顯示將與用戶選擇一起進行的項目。我有這個設置的方法是:ComboboxItem訪問返回null

XAML:

<ComboBox Grid.Column="1" Grid.ColumnSpan="2" x:Name="cmbBox_TubeType_SlabUserCtrl" Height="auto" SelectionChanged="cmbBox1_SelectedIndexChanged" x:FieldModifier="public"> 
     <ComboBoxItem>Item1</ComboBoxItem> 
     <ComboBoxItem>Item2</ComboBoxItem> 
     <ComboBoxItem>Item3</ComboBoxItem> 
</ComboBox> 

C#

if (this.cmbBox1.SelectedIndex == 0) 
{ 
    this.cmbBox2.ItemsSource = new object[] { "B01", "B02" }; 
    this.cmbBox3.ItemsSource = new object[] { "J01", "J22" }; 
} 
else if (this.cmbBox1.SelectedIndex == 1) 
{ 
    this.cmbBox2.ItemsSource = new object[] { "B21", "B22" }; 
    this.cmbBox3.ItemsSource = new object[] { "J21", "J32" }; 
} 
else if (this.cmbBox1.SelectedIndex == 2) 
{ 
    this.cmbBox2.ItemsSource = new object[] { "B31", "B32" }; 
    this.cmbBox3.ItemsSource = new object[] { "J21", "J32" }; 
} 

採用這種設置,然後我這行,這似乎給我搗亂:

string cmb1TypeString = cmbBox1.SelectedItem.ToString(); 

當我運行這個cmb1TypeString被設置爲null。但是,當我在調試過程中查看類值時,它顯示它具有正確的值。

在嘗試其他事情時,我從xaml中取出Combobox1的組合框項目的初始化。相反,我把項目的初始化類定義的在InitializeComponent()之後,如下所示:

this.cmbBox1.ItemsSource = new object[] { "Item1", "Item2","Item3"}; 

隨着這一變化被正確地返回Cmb1TypeString作爲用戶選擇的值。我不知道爲什麼會發生這種情況?如果在xaml中設置了組合框項目和代碼,它們之間有什麼區別?

非常感謝幫助。

回答

0

這不是我的100%清楚你問什麼,但我想你所描述的事實是,你不能ToString()一個ComboBoxItem(儘管它不應該是null要麼)

爲了檢驗我的假設請請使用下面這行代碼代替:

string cmb1TypeString = cmbBox1.SelectedItem.Content.ToString(); 

並查看是否有任何變化。

+0

我會嘗試你的建議。爲了澄清,在代碼後面我使用了語句'string cmb2TypeString = cmbBox2.SelectedItem.ToString();'這會正確返回用戶選擇的值。cmbBox1和cmbBox2/cmbBox3唯一的區別在於第一個項目是在xaml中初始化的,其中第二個和第三個項目是基於cmbBox1的用戶輸入動態初始化的。 – snkp

0

我不知道爲什麼會發生這種情況?

InitializeComponent()方法查找一個URI到XAML文件,並將它傳遞給,基本上創建您在XAML標記已定義的元素的情況下,System.Windows.Application.LoadComponent()方法:

What does InitializeComponent() do, and how does it work in WPF?

在此方法返回之前,您不應該訪問任何元素。如果您已在XAML中爲ComboBoxSelectionChanged事件掛接了事件處理程序,則可能會在初始化所有ComboBox元素之前調用此事件處理程序。

這就是爲什麼你要經常檢查這些元素實際上已經初始化嘗試之前訪問他們在您的SelectionChanged事件處理程序:

if(cmbBox1 != null && cmbBox1.IsLoaded) //<-- 
{ 
    string cmb1TypeString = cmbBox1.SelectedItem.ToString(); 
} 
+0

好的。這就說得通了。所以,如果我理解你的正確,在我的情況下,當我初始化XAML中的項目,因爲我設置SelectionChanged甚至在XAML的項目永遠不會初始化。在InitializeComponent()之後的主類定義中將項添加到組合框是否是一種好習慣?這似乎解決了這個問題,所以只是好奇,如果這是一個很好的編程習慣。 – snkp

+1

最佳做法是學習MVVM設計模式,並將ComboBox的ItemsSource綁定到視圖模型的集合屬性:https://msdn.microsoft.com/en-us/library/hh848246.aspx – mm8

相關問題