[C#] ComboBox - SelectionChanged事件具有舊值,而不是新值


Answers

如果您需要組合框的當前值,請使用DropDownClosed事件而不是selectionChanged。

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

真的很簡單。

Question

C#,.NET 4.0,VS2010。

新來WPF。 我的MainWindow上有一個ComboBox。 我迷上了所述組合框的SelectionChanged事件。 但是,如果我檢查事件處理程序中組合框的值,則它具有舊值。 這聽起來更像是一個“SelectionChanging”事件,而不是一個SelectionChanged事件。

在選擇實際發生後,如何獲得組合框的新值?

目前:

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

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

請注意,如果我使用事件參數args,egeOriginalSource中傳遞的對象,我會得到相同的行為。




第二個選項對我不起作用,因為.Text元素超出了範圍(C#4.0 VS2008)。 這是我的解決方案...

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



我通過使用DropDownClosed事件解決了這個問題,因為在值更改後會稍微觸發。




對於ComboBox中文本的任何更改(當所選索引發生更改並且文本通過編輯進行更改時),將觸發以下事件。

<ComboBox IsEditable="True" TextBoxBase.TextChanged="cbx_TextChanged" />



SelectedItem保存新鮮數據很奇怪,而SelectedValue沒有。 聽起來像是一個bug。 如果Combobox中的項目是ComboBoxItems以外的對象,則需要如下所示:(我的ComboBox包含KeyValuePair

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可以為null,而Visual Studio一直告訴我KeyValuePair不能為null。 這就是為什麼我將SelectedItem轉換為可空的KeyValuePair<string, string>? 。 然後我檢查selectedItem是否具有非null 。 這種方法應適用於您選擇的物品的實際類型。




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

使用e.AddedItems[0] as kProject ,其中kProject是一個保存數據的類,因為它在我作出明確區分之前默認為RemovedItems [0]。 感謝SwDevMan81為我解答這個問題的初始信息。




這對我有效:

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