Combobox在SelectionChanged事件中仍具有旧值

时间:2010-09-11 21:03:56

标签: c# wpf combobox

我对组合框有疑问。我遇到的问题是选择更改事件我绑定它。这是我的代码:

        <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.TexttbSeconds.Text使用旧值,例如,如果组合框最初是Pokey并且我将其更改为Bolt,它仍将使用Pokey值,就好像它的落后一步。

2 个答案:

答案 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