Combobox все еще имеет старое значение в событии SelectionChanged - PullRequest
2 голосов
/ 12 сентября 2010

У меня есть вопрос по поводу поля со списком.Проблема, с которой я столкнулся, связана с событием изменения выбора, к которому я привязан.Вот мой код:

        <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, как будто оно отстает на один шаг позади.

Ответы [ 2 ]

1 голос
/ 12 сентября 2010

В этом случае вы должны использовать ComboBox.SelectedItem, как упомянуто Крисом Тейлором. Но будьте осторожны с установкой IsSelected свойства ComboBoxItem в XAML, потому что если вы сделаете это следующим образом:

<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, поскольку при вызове InitializeComponents компоненты инициализируются в порядке, определенном в XAML. Если ваш первый ComboBoxItem инициализирован, происходит событие. Но текстовые поля не инициализируются и обнуляются, что приводит к исключению.

Один из подходов к решению этой проблемы может быть, если вы поместите TextBox перед ComboBox в XAML, но гораздо лучший подход будет, если вы подключите событие ComboBox в коде так:

public MainWindow()
{
    InitializeComponent();
    comboBox1.SelectionChanged += comboBox1_SelectionChanged;
}
1 голос
/ 12 сентября 2010

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 возникает при загрузке данных, потому что вы установили IsSelected="True" в своем Xaml, если текстовые поля еще не созданы, это вызовет проблему, когда значения текстового поля изначально задавать. Чтобы обойти это, удалите настройку IsSelected из Xaml и просто установите выбор в событии Load окна.

private void Window_Loaded(object sender, RoutedEventArgs e)
{
  comboBox1.SelectedIndex = 0;
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...