[C#] L'evento ComboBox- SelectionChanged ha un valore vecchio, non un nuovo valore


Answers

Utilizzare l'evento DropDownClosed invece di selectionChanged se si desidera il valore corrente della casella combinata.

private void comboBox_DropDownClosed(object sender, EventArgs e)
{
   MessageBox.Show(comboBox.Text) 
}

È davvero così semplice

Question

C #, .NET 4.0, VS2010.

Novità di WPF. Ho un ComboBox sulla mia MainWindow. Ho agganciato l'evento SelectionChanged di detta casella combinata. Tuttavia, se esamino il valore della casella combinata nel gestore eventi, ha il vecchio valore. Questo suona più come un evento "SelectionChanging" di un evento SelectionChanged.

Come ottengo il nuovo valore del ComboBox dopo che la selezione è effettivamente avvenuta?

Attualmente:

this.MyComboBox.SelectionChanged += new SelectionChangedEventHandler(OnMyComboBoxChanged);

...
private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    string text = this.MyComboBox.Text;
}

Nota, ottengo lo stesso comportamento se utilizzo l'oggetto che viene passato nell'argomento dell'evento, egeOriginalSource.




Questo ha funzionato per me:

private void AppName_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
   ComboBoxItem cbi = (ComboBoxItem)AppName.SelectedItem;
   string selectedText = cbi.Content.ToString();
}



private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    string newItem = ((DataRowView) e.AddedItems[0]).Row.ItemArray[0].ToString();
}



È strano che SelectedItem contenga i nuovi dati, mentre SelectedValue no. Mi sembra un insetto. Se i tuoi elementi nella Combobox sono oggetti diversi da ComboBoxItems, avrai bisogno di qualcosa di simile: (il mio ComboBox contiene KeyValuePair s)

var selectedItem = (KeyValuePair<string, string>?)(sender as ComboBox).SelectedItem;
if (!selectedItem.HasValue)
    return;

string selectedValue = selectedItem.Value.Value;  // first .Value gets ref to KVPair

ComboBox.SelectedItem può essere nullo, mentre Visual Studio continua a dirmi che KeyValuePair non può essere nullo. Ecco perché lancio il SelectedItem su un valore KeyValuePair<string, string>? . Quindi controllo se selectedItem ha un valore diverso da null . Questo approccio dovrebbe essere applicabile a qualunque tipo sia effettivamente l'oggetto selezionato.




La seconda opzione non ha funzionato per me perché l'elemento .Text era fuori ambito (C # 4.0 VS2008). Questa era la mia soluzione ...

string test = null;
foreach (ComboBoxItem item in e.AddedItems)
{
   test = item.Content.ToString();
   break;
}



private void indBoxProject_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    int NewProjID = (e.AddedItems[0] as kProject).ProjectID;
    this.MyProject = new kProject(NewProjID);
    LoadWorkPhase();
}

L'uso di e.AddedItems[0] as kProject cui kProject è una classe che contiene i dati ha funzionato per me poiché era predefinito per RemovedItems [0] prima di aver fatto questa distinzione esplicita. Grazie SwDevMan81 per le informazioni iniziali che hanno risposto a questa domanda per me.




Ho risolto questo problema utilizzando l'evento DropDownClosed perché si attiva leggermente dopo la modifica del valore.