ComboBox SelectedItem vs SelectedValue
Le code suivant fonctionne comme vous le souhaitez — MyProperty
le modèle est mis à jour lorsque l'utilisateur sélectionne un élément dans la liste déroulante.
comboBox1.DataBindings.Add("SelectedValue", myModel, "MyProperty", true,
DataSourceUpdateMode.OnPropertyChanged);
La suite, cependant, ne fonctionne pas de la même façon et la mise à jour du modèle n'est pas déclenchée jusqu'à ce que le focus se déplace vers un autre contrôle sur la forme:
comboBox1.DataBindings.Add("SelectedItem", myModel, "MyProperty", true,
DataSourceUpdateMode.OnPropertyChanged);
Quelqu'un sait pourquoi? Je ne sais même pas par où commencer à enquêter sur la cause. Les pointeurs dans la bonne direction pour démarrer l'enquête ou carrément une explication serait également appréciée.
De côté: pour ma part, j'ai fini par la liaison à la fois SelectedItem
et SelectedValue
. De cette façon, je reçois instantanément le modèle de mises à jour sur les changements de l'INTERFACE (par le biais de la SelectedValue
de liaison), et les mises à jour de l'INTERFACE utilisateur basée sur le modèle de programmation des changements (par le biais de la SelectedItem
de liaison).
Vous devez vous connecter pour publier un commentaire.
La
ComboBox
contrôle hérite de laListControl
de contrôle.La
SelectedItem
propriété est un bon membre de laComboBox
de contrôle. L'événement est déclenché sur le changement estzone de liste déroulante.SelectionChangeCommitted
Zone de liste déroulante.SelectionChangeCommitted
La
SelectedValue
propriété est héritée de laListControl
de contrôle.En tant que telle, cette propriété fera feu de l'
ListControl.SelectedValueChanged
événement.ListControl.SelectedValueChanged
Cela dit, ils ne mettent pas le feu à la
INotifyPropertyChanged
.PropertyChanged
l'événement le même, mais ils seront de toute façon. La seule différence est dans le tir de l'événement.SelectedValueChanged
est déclenché dès qu'une nouvelle sélection est faite à partir de la liste de la partie de la zone de liste déroulante, etSelectedItemChanged
est déclenché lorsque l'article est affiché dans la zone de texte partie de la zone de liste déroulante.En bref, ils représentent tous les deux quelque chose dans la liste de la partie de la zone de liste déroulante. Ainsi, lors de la liaison soit la propriété, le résultat est le même, depuis le
PropertyChanged
événement est déclenché dans les deux cas. Et puisqu'ils représentent tous les deux un élément de la liste, ils sont probablement traités de la même façon.Cela vous aide?
EDIT #1
En supposant que la liste de la partie de la zone de liste déroulante représente une propriété (comme je ne peux pas confirmer car je n'ai pas écrit la commande), la liaison soit de
SelectedItem
ouSelectedValue
affecte de la même collection à l'intérieur du contrôle. Puis, lorsque cette propriété est modifiée, la même chose se produit à la fin. LeINotifyPropertryPropertyChanged.PropertyChanged
événement est déclenché sur la même propriété.Je soupçonne que la propriété SelectedItem de la zone de liste déroulante ne change pas jusqu'à ce que la commande a été validée (ce qui se produit lorsque le contrôle perd le focus), alors que la propriété SelectedValue modifications chaque fois que l'utilisateur sélectionne un élément.
Ici est une référence à l'accent des événements qui se produisent sur les contrôles:
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validated.aspx
C'est depuis longtemps une "fonctionnalité" de la liste de contrôles .NET dans mon expérience. Personnellement, je voudrais juste lier à la modification de la propriété SelectedValue et d'écrire ce code supplémentaire est nécessaire pour contourner cette "fonctionnalité" (comme le fait d'avoir deux propriétés, la liaison à un pour SelectedValue, puis, sur l'ensemble de la propriété, la mise à jour de la valeur de SelectedItem dans votre code personnalisé).
De toute façon, j'espère que ça aide =D
Si vous voulez Sélectionné.La valeur de travaillé
vous devez faire les choses suivantes:
Le point clé est de Définir la source de données!
Si nous voulons lier à un dictionnaire ie
puis SelectedItem ne fonctionnera pas whilist SelectedValue sera
SelectedValuePath