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);
ce qui suit, cependant, ne fonctionne pas de la même façon et la mise à jour du modèle n'est pas déclenchée tant que le focus d'entrée ne passe pas à un autre contrôle sur le formulaire:
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. Des conseils dans la bonne direction pour commencer l'enquête ou une explication serait également appréciée.
mis de côté: pour ma part, j'ai fini par la liaison à la fois SelectedItem
et SelectedValue
. De cette façon, j'obtiens les mises à jour instantanées de modèle basées sur les changements D'UI (par le biais de SelectedValue
binding), et les mises à jour D'UI basées sur les changements de modèle programmatique (à travers le SelectedItem
liaison).
5 réponses
ComboBox
le contrôle hérite du ListControl
de contrôle.
SelectedItem
la propriété est un membre de ComboBox
de contrôle. L'événement est déclenché sur le changement est ComboBox.SelectionChangeCommitted
zone de liste déroulante.SelectionChangeCommitted
se produit lorsque l'élément sélectionné a changé et que ce changement est affiché dans le ComboBox.
le SelectedValue
la propriété est héritée du ListControl
de contrôle.
À ce titre, cette propriété va tirer le ListControl.SelectedValueChanged
événement.
ListControl.SelectedValueChanged
se produit lorsque la propriété SelectedValue change.
cela dit, ils ne tireront pas le INotifyPropertyChanged
.PropertyChanged
é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 partie Liste du ComboBox, et SelectedItemChanged
est déclenché lorsque l'article est affiché dans la partie TextBox du ComboBox.
en bref, ils représentent tous les deux quelque chose dans la partie Liste du ComboBox. Ainsi, en liant l'une ou l'autre propriété, le résultat est le même, puisque le PropertyChanged
événement est déclenché dans les deux cas. Et comme ils représentent tous les deux un élément de la liste, ils sont probablement traités de même.
est-ce que cela aide?
EDIT #1
en supposant que la partie Liste du ComboBox représente une propriété (comme je ne peux pas le confirmer puisque je n'ai pas écrit le contrôle), liant l'un ou l'autre de SelectedItem
ou SelectedValue
affecte 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. INotifyPropertryPropertyChanged.PropertyChanged
événement est déclenché sur la même propriété.
je soupçonne que la propriété SelectedItem du ComboBox ne change pas tant que le contrôle n'a pas été validé (ce qui se produit lorsque le contrôle perd focus), alors que la propriété SelectedValue change chaque fois que l'utilisateur sélectionne un article.
Voici une référence aux événements de focus qui se produisent sur les contrôles:
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validated.aspx
c'est une "fonctionnalité" de longue date des contrôles de liste dans .NET dans mon expérience. Personnellement, je me lierais simplement à la modification de la propriété SelectedValue et j'écrirais tout code supplémentaire nécessaire pour contourner cette" fonctionnalité " (comme avoir deux propriétés, lier à une pour SelectedValue, et ensuite, sur l'ensemble de cette propriété, mettre à jour la valeur de SelectedItem dans votre code personnalisé).
de toute façon, j'espère que ça aide =D
SI vous voulez que Sélectionné.La valeur est le travail besoin de faire à la suite
1. Set DisplayMember
2. Set ValueMember
3. Set DataSource (not use Items.Add, Items.AddRange, DataBinding etc.)
le point clé est Set DataSource!
Si nous voulons lier à un dictionnaire ie
<ComboBox SelectedValue="{Binding Pathology, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{x:Static RnxGlobal:CLocalizedEnums.PathologiesValues}" DisplayMemberPath="Value" SelectedValuePath="Key"
Margin="{StaticResource SmallMarginLeftBottom}"/>
puis SelectedItem ne fonctionnera pas whilist SelectedValue sera