我对组合框有疑问。我遇到的问题是选择更改事件我绑定它。这是我的代码:
<ComboBox Height="23"
HorizontalAlignment="Left"
Margin="12,67,0,0"
Name="comboBox1"
VerticalAlignment="Top"
Width="112"
SelectionChanged="comboBox1_SelectionChanged">
<ComboBoxItem Content="Pokey"
IsSelected="True" />
<ComboBoxItem Content="Octo-ooze" />
<ComboBoxItem Content="Bolt" />
<ComboBoxItem Content="Fink" />
</ComboBox>
在后面的代码中:
private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (comboBox1.Text)
{
case "Pokey" :
tbMinutes.Text = "0";
tbSeconds.Text = "8";
break;
case "Octo-ooze":
tbMinutes.Text = "0";
tbSeconds.Text = "16";
break;
case "Bolt":
tbMinutes.Text = "0";
tbSeconds.Text = "23";
break;
case "Fink":
tbMinutes.Text = "1";
tbSeconds.Text = "40";
break;
}
}
正在发生的事情是tbMinutes.Text
和tbSeconds.Text
使用旧值,例如,如果组合框最初是Pokey并且我将其更改为Bolt,它仍将使用Pokey值,就好像它的落后一步。
答案 0 :(得分:1)
comboBox1.Text
返回选择更改之前的值,这是导致问题的原因。您可以使用ComboBox.SelectedItem
访问新选择的项目。
变化看起来像这样
private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ComboBoxItem item = comboBox1.SelectedItem as ComboBoxItem;
if (item != null)
{
switch (item.Content.ToString())
{
// ... Rest of your code here
}
}
}
但是,您可能遇到问题,因为在加载数据时会触发SelectionChanged事件,因为您已在Xaml中设置了IsSelected="True"
,如果尚未创建文本框,则在文本框值时会导致问题最初设定。要解决此问题,请从Xaml中删除IsSelected
设置,然后在窗口的Load事件中设置选择。
private void Window_Loaded(object sender, RoutedEventArgs e)
{
comboBox1.SelectedIndex = 0;
}
答案 1 :(得分:1)
在这种情况下,您应该使用Chris Taylor提到的ComboBox.SelectedItem
。但是要小心设置XAML中IsSelected
的{{1}}属性,因为如果你这样做:
ComboBoxItem
您将获得<ComboBox Height="23"
HorizontalAlignment="Left"
Margin="12,67,0,0"
Name="comboBox1"
VerticalAlignment="Top"
Width="112"
SelectionChanged="comboBox1_SelectionChanged">
<ComboBoxItem Content="Pokey"
IsSelected="True" />
<ComboBoxItem Content="Octo-ooze" />
<ComboBoxItem Content="Bolt" />
<ComboBoxItem Content="Fink" />
</ComboBox>
<TextBox Name="tbMinutes" />
<TextBox Name="tbSeconds" />
,因为在调用NullReferenceException
时,组件将按照XAML中定义的顺序进行初始化。如果您的第一个ComboBoxItem已初始化,则会触发一个事件。但TextBoxes未初始化,null导致异常。
解决问题的一种方法是将文本框放在XAML中的ComboBox之前,但如果你在代码中连接ComboBox的事件就会有更好的方法:
InitializeComponents