ComboboxItem访问返回null

时间:2017-03-27 19:58:55

标签: wpf combobox

我正在用C#开发一个WPF用户控件库。该库具有用户交互的表单。该表单有3个组合框(ComboBox1,ComboBox2和ComboBox3)。一旦用户选择了combobox1中的项目,组合框2和3将显示将与用户选择一起使用的项目。我有这种设置的方式是:

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和代码中设置组合框项目如何处理它们之间有什么区别吗?

非常感谢帮助。

2 个答案:

答案 0 :(得分:1)

  

我不确定为什么会这样?

InitializeComponent()方法将URI定位到XAML文件并将其传递给System.Windows.Application.LoadComponent()方法,该方法基本上创建了您在XAML标记中定义的元素的实例:

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

在此方法返回之前,您不应访问任何元素。如果您在XAML中为SelectionChanged的{​​{1}}事件连接了事件处理程序,则可以在初始化所有ComboBox元素之前调用此事件处理程序。

这就是为什么在尝试在SelectionChanged事件处理程序中访问元素之前,应始终检查元素是否已实际初始化:

ComboBox

答案 1 :(得分:0)

我不是100%清楚你所问的是什么,但我认为你所描述的事实是你不能ToString() ComboBoxItem(尽管它不应该是null或者

要测试我的假设,请使用以下代码行:

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

并查看是否有任何变化。