C #, .NET 4.0, VS2010.
Nouveau sur WPF. J'ai un ComboBox sur ma MainWindow. J'ai accroché l'événement SelectionChanged de ladite zone de liste déroulante. Cependant, si j'examine la valeur de la zone de liste déroulante dans le gestionnaire d'événements, elle a l'ancienne valeur. Cela ressemble plus à un événement "SelectionChanging" qu'à un événement SelectionChanged.
Comment puis-je obtenir la nouvelle valeur de la zone de liste déroulante une fois la sélection effectuée?
Actuellement:
this.MyComboBox.SelectionChanged += new SelectionChangedEventHandler(OnMyComboBoxChanged);
...
private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
string text = this.MyComboBox.Text;
}
Remarque, j'obtiens le même comportement si j'utilise l'objet passé dans l'événement args, egeOriginalSource.
SelectionChanging
en premier lieu?Réponses:
Selon MSDN,
e.AddedItems
:Vous pouvez donc utiliser:
Vous pouvez également utiliser
SelectedItem
si vous utilisez desstring
valeurs pour leItems
desender
:ou
Puisque les deux
Content
etSelectedItem
sont des objets, une approche plus sûre consisterait à utiliser.ToString()
au lieu deas string
la source
ComboBox.SelectedItem
n'a pas de propriété appeléeText
, mais vous pouvez le faireComboBox.SelectedItem as string
(bien que cela ne fonctionne que si vous utilisezstring
pour leItems
- rien testé d'autre)La valeur correcte à vérifier ici est la propriété SelectedItem .
Un ComboBox est un contrôle composite dont deux de ses parties sont:
L'image ci-dessus a été prise immédiatement après l'agrandissement de la ComboBox (c'est-à-dire avant de sélectionner une nouvelle valeur). À ce stade, Text et SelectedItem sont tous deux "Info", en supposant que les éléments ComboBox étaient des chaînes. Si les éléments ComboBox étaient à la place toutes les valeurs d'un Enum appelé «LogLevel», SelectedItem serait actuellement LogLevel.Info .
Lorsqu'un élément de la liste déroulante est cliqué sur, la valeur de SelectedItem est modifiée et l' événement SelectionChanged est déclenché. La propriété Text n'est pas encore mise à jour, cependant, car la partie de texte n'est mise à jour qu'après le SelectionChanged gestionnaire est terminé. Cela peut être observé en mettant un point d'arrêt dans le gestionnaire et en regardant le contrôle:
Étant donné que le texte partie n'a pas été mis à jour à ce stade, le texte propriété renvoie la valeur précédemment sélectionnée.
la source
Utilisez l'événement DropDownClosed au lieu de selectionChanged si vous voulez la valeur actuelle de la zone de liste déroulante.
Est-ce vraiment aussi simple que cela.
la source
Cela a fonctionné pour moi:
la source
Cela a fonctionné pour moi:
la source
sender
contient le correctSelectedItem
.L'événement suivant est déclenché pour toute modification du texte dans la zone de liste déroulante (lorsque l'index sélectionné est modifié et lorsque le texte est également modifié par l'édition).
la source
la source
La deuxième option n'a pas fonctionné pour moi car l'élément .Text était hors de portée (C # 4.0 VS2008). C'était ma solution ...
la source
J'avais besoin de résoudre ce problème dans VB.NET. Voici ce que j'ai qui semble fonctionner:
la source
Il est étrange que SelectedItem contienne les données fraîches, contrairement à SelectedValue. Cela me semble être un bug. Si vos éléments dans la liste déroulante sont des objets autres que ComboBoxItems, vous aurez besoin de quelque chose comme ceci: (my
ComboBox
containsKeyValuePair
s)ComboBox.SelectedItem
peut être nul, alors que Visual Studio n'arrête pas de me dire que aKeyValuePair
ne peut pas être nul. C'est pourquoi j'ai converti leSelectedItem
en nullableKeyValuePair<string, string>?
. Ensuite, je vérifie siselectedItem
a une valeur autre quenull
. Cette approche doit être applicable à tout type d'élément sélectionné.la source
Si vous avez vraiment besoin de l'
SelectionChanged
événement, la meilleure réponse est celle de SwDevMan81. Cependant, si vous commencez avec WPF, vous voudrez peut-être apprendre à faire les choses à la manière WPF, qui est différente des anciens jours Windows Forms quiSelectionChanged
reposaient sur des événements tels que , avec WPF et modèle ViewModel, vous devez utilisez des liaisons. Voici un exemple de code:la source
L'utilisation du
e.AddedItems[0] as kProject
where kProject est une classe qui contient les données a fonctionné pour moi car il était par défaut le RemovedItems [0] avant que j'aie fait cette distinction explicite. Merci SwDevMan81 pour les informations initiales qui ont répondu à cette question pour moi.la source
Ne compliquez pas les choses sans raison. En utilisant la propriété SelectedValue, vous pouvez facilement obtenir une valeur ComboBox sélectionnée comme ceci: YourComboBoxName.SelectedValue.ToString ().
Derrière la scène, la propriété SelectedValue est définie comme suit: SelectedValue {get; set;} cela signifie que vous pouvez l'utiliser pour obtenir ou définir la valeur d'un ComboBox.
L'utilisation de SelectedItem n'est pas un moyen efficace d'obtenir une valeur ComboBox car elle nécessite beaucoup de ramifications.
la source
Vous pouvez vérifier la propriété SelectedIndex ou SelectedValue ou SelectedItem dans l'événement SelectionChanged du contrôle Combobox.
la source
Cela devrait fonctionner pour vous ...
la source
J'ai résolu ce problème en utilisant l'événement DropDownClosed, car il se déclenche légèrement après la modification de la valeur.
la source