ComboBox - événement SelectionChanged a l'ancienne valeur, n'est pas nouvelle valeur
C#, .NET 4.0, VS2010.
Nouveau à WPF. J'ai une zone de liste déroulante sur mon MainWindow. J'ai accroché l'événement SelectionChanged de ladite zone de liste déroulante. Cependant, si j'examine la valeur de la liste déroulante dans le gestionnaire d'événements, c'est l'ancienne valeur. Cela sonne plus comme un "SelectionChanging" de l'événement, qu'un événement SelectionChanged.
Comment puis-je obtenir la nouvelle valeur de la zone de liste déroulante après la sélection a réellement eu lieu?
Actuellement:
this.MyComboBox.SelectionChanged += new SelectionChangedEventHandler(OnMyComboBoxChanged);
...
private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
string text = this.MyComboBox.Text;
}
Remarque, j'ai le même comportement si j'utilise l'objet est transmis dans le cas args, par exemple.OriginalSource.
- Je viens de tombé sur le même problème - merci! Est-ce réellement un bug, et il aurait été nommé
SelectionChanging
en premier lieu?
Vous devez vous connecter pour publier un commentaire.
Selon MSDN,
e.AddedItems
:De sorte que vous pouvez utiliser:
Vous pouvez également utiliser
SelectedItem
si vous utilisezstring
valeurs pour lesItems
de lasender
:ou
Depuis deux
Content
etSelectedItem
sont des objets, une approche plus sûre serait d'utiliser.ToString()
au lieu deas string
ComboBox.SelectedItem
n'est pas une propriété appeléeText
, mais vous pouvez le faireComboBox.SelectedItem as string
(bien que cela ne fonctionne que si vous utilisezstring
pour laItems
- pas testé autre chose)La valeur correcte pour vérifier ici est la SelectedItem de la propriété.
Une zone de liste déroulante est un contrôle composite avec deux de ses pièces:
L'image ci-dessus a été prise immédiatement après la zone de liste déroulante a été élargie (c'est à dire avant de sélectionner une nouvelle valeur). À ce stade, les deux Texte et SelectedItem sont des "Infos", en supposant que la zone de liste déroulante d'éléments étaient les chaînes de caractères. Si la zone de liste déroulante d'éléments ont été au lieu de toutes les valeurs de l'Enum appelé "LogLevel", SelectedItem serait actuellement de LogLevel.Info.
Lorsqu'un élément dans le menu déroulant, cliquez sur la valeur de SelectedItem est changé et la SelectionChanged événement est déclenché. Le Texte propriété n'est pas mis à jour encore, bien que, comme le Partie du Texte n'est pas mis à jour jusqu'à ce que après la SelectionChanged gestionnaire est fini. Ceci peut être observé en mettant un point d'arrêt dans le gestionnaire et en regardant le contrôle:
Depuis le Partie du Texte n'a pas été mis à jour à ce stade, le Texte propriété renvoie précédemment sélectionné, la valeur.
Utiliser le DropDownClosed de l'événement au lieu de selectionChanged si vous voulez que la valeur actuelle de la liste déroulante.
Est vraiment aussi simple que cela.
Cela a fonctionné pour moi:
Cela a fonctionné pour moi:
sender
contient la bonneSelectedItem
.Événement suivant est déclenché en cas de changement du texte dans la zone de liste déroulante (lorsque l'indice choisi est changé et quand le texte est modifié par l'édition de trop).
La deuxième option ne fonctionne pas pour moi à cause de la .Élément de texte est hors de portée (C# 4.0 VS2008). C'était ma solution...
J'avais besoin pour résoudre ce dans VB.NET. Voici ce que j'ai qui semble fonctionner:
C'est bizarre que SelectedItem détient les frais de données, tandis que SelectedValue ne l'est pas. Sonne comme un bug pour moi. Si vos éléments dans la zone de liste déroulante sont des objets autres que des ComboBoxItems, vous aurez besoin de quelque chose comme ceci: (mon
ComboBox
contientKeyValuePair
s)ComboBox.SelectedItem
peut être nulle, alors que Visual Studio me dit qu'unKeyValuePair
ne peut pas être null. C'est pourquoi je lance leSelectedItem
à nullableKeyValuePair<string, string>?
. Puis-je vérifier siselectedItem
a une valeur autre quenull
. Cette approche devrait être applicable quel que soit le type de votre élément sélectionné est en réalité.Si vous avez vraiment besoin de la
SelectionChanged
cas, la meilleure réponse est SwDevMan81 de réponse. Toutefois, si vous commencez avec WPF, alors vous voudrez peut-être savoir comment faire les choses en WPF façon, ce qui est différent de celui de l'ancien Windows Forms jours que l'habitude de compter sur des événements comme leSelectionChanged
, avec WPF et Model View ViewModel modèle, vous devez utiliser les liaisons. Voici un exemple de code:L'utilisation de la
e.AddedItems[0] as kProject
où kProject est une classe qui contient les données travaillé pour moi, comme il a été défaillant à la RemovedItems[0] avant, j'ai fait cette distinction explicite. Grâce SwDevMan81 pour les premières informations qui ont répondu à cette question pour moi.Ne pas compliquer les choses sans raison. À l'aide de SelectedValue propriété, vous pouvez facilement obtenir une liste modifiable sélectionnée valeur comme ceci: YourComboBoxName.SelectedValue.ToString().
Derrière la scène, le SelectedValue propriété est définie comme: SelectedValue{get; set;} cela signifie que vous pouvez utiliser pour obtenir ou définir la valeur d'une zone de liste déroulante.
À l'aide de SelectedItem n'est pas un moyen efficace d'obtenir une zone de liste déroulante valeur, car il nécessite beaucoup de ramifications.
Cela devrait fonctionner pour vous ...
J'ai résolu ce problème en utilisant le DropDownClosed événement, car il déclenche légèrement après la valeur est modifiée.