2017-03-27 59 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

相关问题