2014-09-11 11 views
5

Debug uno strano NullRefException vedo il seguente quadro:WPF ComboBox.SelectedValue è null ma .SelectedItem non lo è; SelectedValuePath è impostato. Perché?

Double-shot to display .SelectedItem

Così, quando il codice si riferisce a .SelectedValue si blocca.

Non riesco a capire come è possibile impostare .SelectedItem ma non .SelectedValue. I valori visualizzati nel visualizzatore del debugger sono corretti, anche .SelectedIndex è appropriato. ComboBox di .ItemsSource è impostato su un List<DvcTypes> in codice:

cbAdmDvc.ItemsSource = J790M.DAL.DvcTypes.GetList(); 

.SelectedValuePath è impostata in XAML:

<ComboBox Name="cbAdmDvc" DisplayMemberPath="sDvcType" 
    SelectedValuePath="tiDvcType" SelectionChanged="cbAdmDvc_SelectionChanged".. /> 

parte a discesa viene visualizzato correttamente .sDvcType etichette in seguito.
La stessa implementazione funziona per un sacco di altri combo-box di filtraggio (altri 7).
Questo accade durante l'evento Loaded per la finestra principale.

risposta

3

Finora non riesco a spiegare il comportamento osservato, ma ha trovato una soluzione relativamente semplice:

private void cbAdmDvc_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if( cbAdmDvc.SelectedIndex < 0 ) return; 

    DvcType tiDvc;  /// add this temp variable to capture .SelectedValue 

    if( cbAdmDvc.SelectedValue != null ) 
     tiDvc= (DvcType) cbAdmDvc.SelectedValue; 
    else 
     tiDvc= ((DvcTypes) cbAdmDvc.SelectedItem).tiDvcType; 

    DoSmth(tiDvc); /// instead of DoSmth((DvcType)cbAdmDvc.SelectedValue) 
} 

sciocco, ma funziona, dal momento che .SelectedItem è impostato correttamente.
Come ho detto prima, questo è l'unico ComboBox sperimentare tali stranezze su diversi ..

EDIT 2014-Ott-21:

Dopo aver apportato alcune modifiche nella logica dell'applicazione sorprendentemente ritrovai a guardare allo stesso problema con un altro ComboBox. Trovato una potenziale soluzione combobox-selectedvalue-not-updating-from-binding-source, ma quando ho provato a impostare i valori iniziali tramite .SelectedItem invece di .SelectedValue le cose sono diventate ancora più bizzarre/peggio. Così ho provato ad applicare la mia soluzione precedente anche qui e ha funzionato!

Ecco il mio tentativo di spiegare il comportamento osservato:
impostato un valore iniziale nel codice (CBox.SelectedValue= smth;) fa scattare CBox_SelectionChanged evento. Per qualche ragione, in quel momento, leggere .SelectedValue restituisce null (come se non fosse ancora pronto), tuttavia leggere .SelectedItem sembra funzionare bene! Una volta che sei fuori di CBox_SelectionChanged codice evento in grado di leggere correttamente .. .SelectedValue

Quindi, se si) dispone di un gestore per _SelectionChanged evento,) si riferiscono ad .SelectedValue al suo interno, e) sono impostazione scelta iniziale tramite .SelectedValue da qualche altra parte nel codice - attenzione per null e codice in modo difensivo! HTH !! :)