C #, .NET 4.0, VS2010.
Novo no WPF. Eu tenho uma ComboBox na minha MainWindow. Eu enganchei o evento SelectionChanged da referida caixa de combinação. No entanto, se eu examinar o valor da caixa de combinação no manipulador de eventos, ele terá o valor antigo. Isso soa mais como um evento "SelectionChanging" do que um evento SelectionChanged.
Como obtenho o novo valor da ComboBox após a seleção realmente acontecer?
Atualmente:
this.MyComboBox.SelectionChanged += new SelectionChangedEventHandler(OnMyComboBoxChanged);
...
private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
string text = this.MyComboBox.Text;
}
Observe, obtenho o mesmo comportamento se usar o objeto que está sendo passado no argumento de evento, egeOriginalSource.
SelectionChanging
em primeiro lugar?Respostas:
De acordo com o MSDN
e.AddedItems
:Então você pode usar:
Você também pode usar
SelectedItem
se usarstring
valores para oItems
desender
:ou
Uma vez que
Content
eSelectedItem
são objetos, uma abordagem mais segura seria usar em.ToString()
vez deas string
fonte
ComboBox.SelectedItem
não tem uma propriedade chamadaText
, mas você pode fazerComboBox.SelectedItem as string
(embora isso só funcione se você usarstring
paraItems
- não testado nada mais)O valor correto a ser verificado aqui é a propriedade SelectedItem .
Um ComboBox é um controle composto com duas de suas partes sendo:
A imagem acima foi obtida imediatamente após a expansão do ComboBox (ou seja, antes de selecionar um novo valor). Neste ponto, Text e SelectedItem são "Info", assumindo que os itens do ComboBox eram strings. Se os itens ComboBox fossem, em vez disso, todos os valores de um Enum chamado "LogLevel", SelectedItem seria atualmente LogLevel.Info .
Quando um item no menu suspenso é clicado, o valor de SelectedItem é alterado e o evento SelectionChanged é gerado. A propriedade Text ainda não foi atualizada, já que a parte do texto não é atualizada até que o manipulador SelectionChanged seja concluído. Isso pode ser observado colocando um ponto de interrupção no manipulador e olhando para o controle:
Como a parte do texto ainda não foi atualizada, a propriedade Text retorna o valor selecionado anteriormente.
fonte
Use o evento DropDownClosed em vez de selectionChanged se desejar o valor atual da caixa de combinação.
É realmente tão simples.
fonte
Isso funcionou para mim:
fonte
Isso funcionou para mim:
fonte
sender
contém o corretoSelectedItem
.O evento seguinte é disparado para qualquer alteração do texto na ComboBox (quando o índice selecionado é alterado e quando o texto é alterado pela edição também).
fonte
fonte
A segunda opção não funcionou para mim porque o elemento .Text estava fora do escopo (C # 4.0 VS2008). Esta foi a minha solução ...
fonte
Eu precisava resolver isso no VB.NET. Aqui está o que eu tenho que parece funcionar:
fonte
É estranho que SelectedItem mantenha os dados novos, enquanto SelectedValue não. Parece um bug para mim. Se seus itens no Combobox forem objetos diferentes de ComboBoxItems, você precisará de algo assim: (my
ComboBox
containsKeyValuePair
)ComboBox.SelectedItem
pode ser nulo, enquanto o Visual Studio fica me dizendo que aKeyValuePair
não pode ser nulo. É por isso que lancei oSelectedItem
para um anulávelKeyValuePair<string, string>?
. Então eu verifico seselectedItem
tem um valor diferente denull
. Essa abordagem deve ser aplicável a qualquer tipo de seu item selecionado.fonte
Se você realmente precisa do
SelectionChanged
evento, a melhor resposta é a resposta de SwDevMan81. No entanto, se você está começando com WPF, então você pode querer aprender como fazer as coisas da maneira WPF, que é diferente dos velhos dias do Windows Forms que costumavam depender de eventos comoSelectionChanged
, com WPF e o padrão Model View ViewModel, você deve usar ligações. Aqui está um exemplo de código:fonte
O uso de
e.AddedItems[0] as kProject
where kProject é uma classe que mantém os dados trabalhados para mim, já que era padronizado para RemovedItems [0] antes de eu fazer essa distinção explícita. Obrigado SwDevMan81 pelas informações iniciais que responderam a esta pergunta para mim.fonte
Não complique as coisas sem motivo. Usando a propriedade SelectedValue, você pode obter facilmente um valor ComboBox selecionado como este: YourComboBoxName.SelectedValue.ToString ().
Nos bastidores, a propriedade SelectedValue é definida como: SelectedValue {get; set;} isso significa que você pode usá-lo para obter ou definir o valor de uma ComboBox.
Usar SelectedItem não é uma maneira eficiente de obter um valor de ComboBox, pois requer muitas ramificações.
fonte
Você pode verificar a propriedade SelectedIndex ou SelectedValue ou SelectedItem no evento SelectionChanged do controle Combobox.
fonte
Isso deve funcionar para você ...
fonte
Resolvi isso usando o evento DropDownClosed porque ele dispara um pouco depois que o valor é alterado.
fonte