[c#] ComboBox- SelectionChanged 이벤트에 새 값이 아닌 이전 값이 있습니다.

C #, .NET 4.0, VS2010.

WPF를 처음 사용합니다. 내 MainWindow에 ComboBox가 있습니다. 해당 콤보 상자의 SelectionChanged 이벤트를 연결했습니다. 그러나 이벤트 처리기에서 콤보 상자의 값을 살펴보면 이전 값이 있습니다. 이것은 SelectionChanged 이벤트보다 “SelectionChanging”이벤트처럼 들립니다.

선택이 실제로 발생한 후 ComboBox의 새 값을 어떻게 얻습니까?

현재 :

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

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

이벤트 인수 인 egeOriginalSource에서 전달되는 개체를 사용하면 동일한 동작이 발생합니다.



답변

MSDN에 따르면 e.AddedItems:

선택한 항목이 포함 된 목록을 가져옵니다.

따라서 다음을 사용할 수 있습니다.

private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    string text = (e.AddedItems[0] as ComboBoxItem).Content as string;
}

당신은 또한 사용할 수 있습니다 SelectedItem당신이 사용하는 경우 string값을 Items로부터 sender:

private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    string text = (sender as ComboBox).SelectedItem as string;
}

또는

private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    string text = ((sender as ComboBox).SelectedItem as ComboBoxItem).Content as string;
}

모두 때문에 ContentSelectedItem있는 개체, 안전한 방법은 사용하는 것 .ToString()대신에as string


답변

여기서 확인할 올바른 값은 SelectedItem입니다. 속성입니다.

ComboBox는 다음과 같은 두 부분으로 구성된 복합 컨트롤입니다.

  1. 텍스트 부분 :이 부분의 값은 텍스트에 해당합니다. 은 ComboBox 속성에 해당합니다.
  2. 선택기 부분 (예 : “드롭 다운”부분) :이 부분에서 선택된 항목은 SelectedItem 속성에 해당 합니다.

확장 된 ComboBox 부품

위의 이미지는 ComboBox가 확장 된 직후 (즉, 새 값을 선택하기 전에) 찍은 것입니다. 이 시점 에서 ComboBox 항목이 문자열이라고 가정하면 TextSelectedItem 은 모두 “Info”입니다. 대신 ComboBox 항목이 “LogLevel”이라는 Enum의 모든 값이면 SelectedItem 은 현재 LogLevel.Info가 됩니다.

드롭 다운의 항목을 클릭하면 SelectedItem 의 값 이 변경되고 SelectionChanged 이벤트가 발생합니다. 그러나 Text 속성은 SelectionChanged 처리기가 완료 될 때까지 텍스트 부분 이 업데이트되지 않으므로 아직 업데이트되지 않았습니다 . 핸들러에 중단 점을 넣고 컨트롤을 보면이를 확인할 수 있습니다.

SelectionChanged 처리기의 중단 점에있는 ComboBox

때문에 텍스트 부분이 이 시점에서 업데이트되지 않았습니다의 텍스트 속성은 이전에 선택한 값을 반환합니다.


답변

콤보 상자의 현재 값을 원하는 경우 selectionChanged 대신 DropDownClosed 이벤트를 사용하십시오.

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

정말 간단합니다.


답변

이것은 나를 위해 일했습니다.

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)
{
    var text = ((sender as ComboBox).SelectedItem as ComboBoxItem).Content as string;
}


답변

ComboBox의 텍스트 변경에 대해 다음 이벤트가 발생합니다 (선택한 인덱스가 변경되고 텍스트도 편집으로 변경 될 때).

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


답변

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