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).

45
demandé sur Adam Lear 2010-05-21 19:38:45

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é.

37
répondu Will Marcouiller 2010-05-21 17:27:54

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

5
répondu George Howarth 2010-05-21 16:00:01

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

2
répondu Allen E. Scharfenberg 2010-05-21 15:42:07

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!

1
répondu isxaker 2013-08-12 07:20:48

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

1
répondu Oyiwai 2017-02-26 12:31:25