2014-09-11 19 views
5

i aşağıdaki resme bakın garip NullRefException ayıklama: Kod .SelectedValue atıfta zaman WPF ComboBox.SelectedValue boş ama .SelectedItem değil; SelectedValuePath ayarlandı. Niye ya?

Double-shot to display .SelectedItem

Yani çöker.

ben .SelectedItem ayarlanabilir anlayamıyorum

ancak .SelectedValue değil. Hata ayıklayıcısının görüntüleyicide görüntülenen değerler doğru, .SelectedIndex da uygundur. ComboBox en .ItemsSource kodunda bir List<DvcTypes> olarak ayarlanır:

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

.SelectedValuePath XAML ayarlanır:

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

Açılır kısmı düzgün sonradan .sDvcType etiketleri görüntülüyor.
Çok hemen aynı uygulama diğer filtreleme açılır kutular (7 diğer) bir demet için çalışır.
Bu, ana pencere için Yüklenen olay sırasında gerçekleşiyor.

cevap

3

Şimdiye kadar ben gözlemlenen davranışları açıklamak, ama nispeten basit bir geçici çözüm bulundu olamaz:

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

Silly ancak .SelectedItem düzgün ayarlanmış olduğundan, çalışır. Uygulama mantığı bazı değişiklikler yaptıktan sonra

şaşırtıcı kendimi arıyorum bulundu:
i

DÜZENLEME 2014-Ekim-21 bu .. birkaçı dışında bu tür tuhaflıklar yaşanıyor tek ComboBox olduğunu daha önce belirttiğimiz gibi başka bir ComboBox ile aynı konuda. Potansiyel bir çözüm combobox-selectedvalue-not-updating-from-binding-source Bulunan, ama .SelectedItem yerine .SelectedValue şeylere aracılığıyla ilk değerlerini ayarlama çalıştığımızda kötü/daha da garip var. Bu yüzden benim önceki çözümümüzü de burada uygulamaya çalıştım ve işe yaradı!

Burada gözlemlenen davranışları açıklamak benim girişimi var: kodunda bir başlangıç ​​değeri ayarlanması
(CBox.SelectedValue= smth;) CBox_SelectionChanged olayı tetikler. Ancak .SelectedItem okuma (henüz hazır değil sanki) null .SelectedValue döner okurken o anda nedense, için iyi iş gibi görünüyor! Eğer) _SelectionChanged olay için bir işleyici varsa, Yani düzgün .SelectedValue ..

okuyabilir CBox_SelectionChanged olay kodunun dışına gittiğinizde 2) içindeki .SelectedValue bakın ve) vardır kodunda başka bir yere .SelectedValue aracılığıyla ilk seçim ayarı - savunmaya null ve kod dikkat! HTH !! :)

İlgili konular