Получение текста выбранного индекса WPF ComboBox - PullRequest
2 голосов
/ 27 февраля 2012

У меня есть событие для ComboBox, "SelectionChange".

Вот что я пытаюсь сделать:

  1. У меня есть два ComboBox
  2. Второй ComboBox будет отображать элементы в зависимости от выбранного элемента в первом поле
  3. ComboBox2 должен реагировать, как только элемент на ComboBox1 выбран

Моя проблема в том, что я пытаюсь получить SelectedIndex.

Когда я использую ComboBox1.Text после подтверждения SelectedIndex, он возвращает ноль, поэтому ComboBox2 не реагирует.

Я попытался поместить кнопку, чтобы вызвать событие, и оно сработало. Кажется, что SelectedIndex не изменится, пока вы не отпустите фокус.

Вот фрагмент кода:

if (cb_subj.SelectedIndex == ctr)
{
     cb_section.Items.Clear();
     if (connectToDB.openConnection() == true)
     {
         MySqlDataAdapter comboBoxItems_seclist = new MySqlDataAdapter();

         MySqlCommand query = new MySqlCommand(@"SELECT section_code FROM sections 
                             WHERE subject = @subj", connectToDB.connection);
         query.Parameters.AddWithValue("@subj", cb_subj.Text);

         comboBoxItems_seclist.SelectCommand = query;


         System.Data.DataTable classlist = new System.Data.DataTable();

         comboBoxItems_seclist.Fill(classlist);

         foreach (System.Data.DataRow row in classlist.Rows)
         {
            string rows = string.Format("{0}", row.ItemArray[0]);
            cb_section.Items.Add(rows);
         }
       }

      break;
}

Вот XAML двух CB:

<ComboBox Height="23" HorizontalAlignment="Left" Margin="166,12,0,0" Name="cbox_year" VerticalAlignment="Top" Width="120" SelectionChanged="cbox_year_SelectionChanged">
        <ComboBoxItem Content="1st Year / 1st Sem" />
        <ComboBoxItem Content="1st Year / 2nd Sem" />
        <ComboBoxItem Content="2nd Year / 1st Sem" />
        <ComboBoxItem Content="2nd Year / 2nd Sem" />
        <ComboBoxItem Content="3rd Year / 1st Sem" />
        <ComboBoxItem Content="3rd Year / 2nd Sem" />
        <ComboBoxItem Content="4th Year / 1st Sem" />
        <ComboBoxItem Content="4th Year / 2nd Sem" />
    </ComboBox>
    <ComboBox Height="23" HorizontalAlignment="Left" Margin="166,41,0,0" Name="cb_subj" VerticalAlignment="Top" Width="120" SelectionChanged="cb_subj_SelectionChanged" />

Ответы [ 3 ]

3 голосов
/ 27 февраля 2012

Для быстрого успеха вы можете получить доступ к ComboBox1.SelectedValue или ComboBox1.SelectedItem вместо ComboBox1.Text.

Ваша основная проблема заключается в том, что при изменении выделения в ComboBox1, оно не меняет напрямую ComboBox1.Text, вам (т.е. фокусу) придется покинуть ComboBox1, пока текст не будет обновлен.Как правило, вы можете избежать таких проблем, используя привязку данных вместо этого подхода, основанного на событиях.

1 голос
/ 27 февраля 2012

Это не похоже на использованную привязку? Я бы порекомендовал использовать привязку, а затем включить свойство UpdateSourceTrigger привязки в UpdateSourceTrigger.PropertyChanged

В нижележащем объекте вы можете прослушивать событие, измененное свойством, но обязательно реализуйте INotifyPropertyChanged.

Для примера посмотрите на http://www.tanguay.info/web/index.php?pg=codeExamples&id=304

Более подробно:

В представлении убедитесь, что вы установили DataContext и заполните коллекцию года Также важно INotifyPropertyChanged

Для одного комбинированного списка это и для другого почти одно и то же.

    private ObservableCollection<KeyValuePair<string, string>> _yearValues = new   ObservableCollection<KeyValuePair<string, string>>();
    public ObservableCollection<KeyValuePair<string, string>> YearValues
    {
        get
        {
            return _yearValues;
        }

        set
        {
            _yearDownValues = value;
            OnPropertyChanged("YearValues");
        }
    }

    private string _selectedYear;
    public string SelectedYear
    {
        get
        {
            return _selectedYear;
        }

        set
        {
            _selectedYear = value;
            OnPropertyChanged("SelectedYear");
        }
    }

Обязательно подключите OnPropertyChanged и сделайте свое дело

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        if (propertyName == "SelectedYear")
        {
            // populate subj collection which will update the combobox
        }
    }

В вашем xaml:

<ComboBox Name="YearCombobox" 
        ItemsSource="{Binding YearValues}"
        SelectedValue="{Binding SelectedYear}"
        SelectedValuePath="Key"
        DisplayMemberPath="Value"/>
<ComboBox Name="SubjCombobox" 
        ItemsSource="{Binding SubjValues}"
        SelectedValue="{Binding SelectedSubj}"
        SelectedValuePath="Key"
        DisplayMemberPath="Value"/>
0 голосов
/ 27 февраля 2012

Вы пробовали

e.AddedItems[0]

Похоже, что если вы не используете MVVM (что обычно следует делать), иногда SelectionChanged обнуляется. Выберите это вместо других.

Попробуйте

var selectionItem = e.AddedItems[0] as ComboBoxItem;
string text = selectionItem.Content.ToString();

e.RemovedItems также можно использовать для получения ранее выбранного элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...