ComboBox SelectedItem vs SelectedValue

Il codice seguente funziona come previsto: MyProperty sul modello viene aggiornato quando l’utente seleziona un nuovo elemento nel menu a discesa.

 comboBox1.DataBindings.Add("SelectedValue", myModel, "MyProperty", true, DataSourceUpdateMode.OnPropertyChanged); 

Di seguito, tuttavia, non funziona nello stesso modo e l’aggiornamento del modello non viene triggersto finché lo stato attivo di input non si sposta su un altro controllo nel modulo:

 comboBox1.DataBindings.Add("SelectedItem", myModel, "MyProperty", true, DataSourceUpdateMode.OnPropertyChanged); 

Qualcuno sa perché? Non so nemmeno da dove iniziare a indagare sulla causa. Puntatori nella giusta direzione per avviare l’indagine o una spiegazione esplicita sarebbero ugualmente apprezzati.

A parte : per i miei scopi, ho finito per bind sia a SelectedItem che a SelectedValue . In questo modo ottengo aggiornamenti istantanei del modello basati su modifiche dell’interfaccia utente (tramite il binding SelectedValue ) e aggiornamenti dell’interfaccia utente basati su modifiche al modello programmatico (tramite l’associazione SelectedItem ).

Il controllo ComboBox eredita dal controllo ListControl .

La proprietà SelectedItem è un membro appropriato del controllo ComboBox . L’evento che viene triggersto in caso di modifica è ComboBox.SelectionChangeCommitted

ComboBox.SelectionChangeCommitted

Si verifica quando l’elemento selezionato è cambiato e tale modifica viene visualizzata nel ComboBox.

La proprietà SelectedValue viene ereditata dal controllo ListControl . Pertanto, questa proprietà genererà l’evento ListControl.SelectedValueChanged .

ListControl.SelectedValueChanged

Si verifica quando la proprietà SelectedValue cambia.

Detto questo, non INotifyPropertyChanged l’ INotifyPropertyChanged . PropertyChanged evento PropertyChanged è lo stesso, ma lo faranno comunque. L’unica differenza è nell’evento di fuoco. SelectedValueChanged viene triggersto non appena viene effettuata una nuova selezione dalla parte elenco di ComboBox e SelectedItemChanged viene triggersto quando l’elemento viene visualizzato nella parte TextBox del ComboBox.

In breve, rappresentano entrambi qualcosa nella parte elenco di ComboBox. Quindi, quando si associa una proprietà, il risultato è lo stesso, poiché l’evento PropertyChanged viene triggersto in entrambi i casi. E poiché entrambi rappresentano un elemento dalla lista, probabilmente sono trattati allo stesso modo.

questo aiuta?

MODIFICA # 1

Supponendo che la parte elenco del ComboBox rappresenti una proprietà (poiché non posso confermare poiché non ho scritto il controllo), l’associazione di SelectedItem o SelectedValue influisce sulla stessa raccolta all’interno del controllo. Quindi, quando questa proprietà viene modificata, lo stesso si verifica alla fine. L’evento INotifyPropertryPropertyChanged.PropertyChanged viene INotifyPropertryPropertyChanged.PropertyChanged sulla stessa proprietà.

Sospetto che la proprietà SelectedItem del ComboBox non cambi fino a quando il controllo non è stato convalidato (che si verifica quando il controllo perde lo stato attivo), mentre la proprietà SelectedValue cambia ogni volta che l’utente seleziona un elemento.

Ecco un riferimento agli eventi di messa a fuoco che si verificano sui controlli:

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validated.aspx

Questa è una “funzionalità” di lunga data dei controlli di elenco in .NET nella mia esperienza. Personalmente, legherei semplicemente al cambiamento della proprietà SelectedValue e scrivo tutto il codice aggiuntivo necessario per ovviare a questa “caratteristica” (come avere due proprietà, vincolare a una per SelectedValue e quindi, sul set di quella proprietà, aggiornando il valore di SelectedItem nel tuo codice personalizzato).

Comunque, spero che aiuti = D

Se vuoi che Selected.Value sia lavoro, devi seguire quanto segue

 1. Set DisplayMember 2. Set ValueMember 3. Set DataSource (not use Items.Add, Items.AddRange, DataBinding etc.) 

Il punto chiave è Set DataSource!

Se vogliamo bind a un dizionario, ad es

   

allora SelectedItem non funzionerà con la volontà di SelectedValue