2010-05-21 19 views
40

निम्नलिखित कोड काम करता है के रूप में आप उम्मीद थी - मॉडल पर MyProperty अद्यतन जब उपयोगकर्ता ड्रॉपडाउन में एक नया आइटम उठाता है।ComboBox SelectedItem बनाम SelectedValue

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

निम्नलिखित है, तथापि, उसी तरह काम नहीं करता है और मॉडल अद्यतन फार्म पर एक और नियंत्रण के लिए इनपुट फ़ोकस ले जाता है जब तक ट्रिगर नहीं है:

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

किसी को भी पता है क्यों ? मैं यह भी नहीं जानता कि कारण की जांच शुरू करनी है। जांच शुरू करने के लिए सही दिशा में पॉइंटर्स या पूरी तरह से स्पष्टीकरण की सराहना की जाएगी।

एक तरफ: मेरे प्रयोजनों के लिए, मैं SelectedItem और SelectedValue दोनों के लिए बाध्य कर दिया। इस तरह से मैं यूआई परिवर्तन (SelectedValue बंधन के माध्यम से) के आधार पर तत्काल मॉडल अद्यतन, और कार्यक्रम संबंधी मॉडल परिवर्तन (SelectedItem बंधन के माध्यम से) के आधार पर यूआई अपडेट प्राप्त करें।

उत्तर

36

ComboBox नियंत्रण संभालते हैं:

यहाँ ध्यान देने की घटनाओं है कि नियंत्रण पर होने के लिए एक संदर्भ है।

SelectedItem संपत्ति ComboBox नियंत्रण का एक उचित सदस्य है। घटना में है कि परिवर्तन पर निकाल दिया जाता है ComboBox.SelectionChangeCommitted

ComboBox.SelectionChangeCommitted

तब होता है जब चयनित आइटम बदल गया है और है कि परिवर्तन ComboBox में प्रदर्शित किया जाता है।

SelectedValue संपत्ति ListControl नियंत्रण से विरासत में मिली है। जैसे, इस संपत्ति ListControl.SelectedValueChanged ईवेंट को सक्रिय होगा।

ListControl.SelectedValueChanged

तब होता है जब SelectedValue गुण परिवर्तन।

कहा कि, वे INotifyPropertyChanged सक्रिय नहीं होगा।PropertyChanged ईवेंट वही है, लेकिन वे वैसे भी करेंगे। फायरिंग घटना में एकमात्र अंतर है। SelectedValueChanged को कॉम्बोबॉक्स के सूची भाग से एक नया चयन किया जाता है, और SelectedItemChanged को निकाल दिया जाता है जब आइटम कॉम्बोबॉक्स के टेक्स्टबॉक्स भाग में प्रदर्शित होता है।

संक्षेप में, वे दोनों कॉम्बोबॉक्स के सूची भाग में कुछ का प्रतिनिधित्व करते हैं। इसलिए, जब किसी भी संपत्ति को बाध्यकारी करते हैं, तो परिणाम वही होता है, क्योंकि PropertyChanged ईवेंट किसी भी मामले में निकाल दिया जाता है। और चूंकि वे दोनों सूची से तत्व का प्रतिनिधित्व करते हैं, इसलिए उन्हें शायद ही वही माना जाता है।

क्या इससे मदद मिलती है?

संपादित करें # 1

यह मानते हुए कि ComboBox की सूची हिस्सा एक संपत्ति का प्रतिनिधित्व करता है (जैसा कि मैंने के बाद से मैं नियंत्रण नहीं लिखा था की पुष्टि नहीं कर सकते हैं), बंधन या तो की SelectedItem या SelectedValue ही प्रभावित करता है नियंत्रण के अंदर संग्रह। फिर, जब यह संपत्ति बदल जाती है, तो अंत में भी यही होता है। INotifyPropertryPropertyChanged.PropertyChanged ईवेंट उसी संपत्ति पर निकाल दिया जाता है।

2

यह एक लंबे समय से मेरे अनुभव में .NET में सूची नियंत्रण के "सुविधा" है। व्यक्तिगत रूप से, मैं सिर्फ SelectedValue संपत्ति के परिवर्तन पर करने के लिए बाध्य और लिखना जो भी अतिरिक्त कोड इस "सुविधा" वैकल्पिक हल के लिए आवश्यक है (जैसे कि दो गुण, SelectedValue के लिए एक के लिए बाध्य के रूप में, और फिर, यह है कि संपत्ति के सेट पर होता है, अपने कस्टम कोड में चयनित इटैम से मूल्य अपडेट करना)।

वैसे भी, मुझे आशा है कि मदद करता है = डी

+1

मैं दो बाइंडिंग की स्थापना समाप्त हो गया - SelectedValue करने के लिए एक और SelectedItem करने के लिए एक और नहीं था ' टी से परे किसी भी कस्टम कोड की जरूरत नहीं है। :) –

+0

@ अन्ना खुशी यह सुनकर खुशी हुई कि आप इसे काम कर रहे हैं :) –

5

मुझे लगता है कि ComboBox की SelectedItem संपत्ति जब तक नियंत्रण मान्य किया गया है परिवर्तन नहीं करता है (जो तब होता है जब नियंत्रण ध्यान केंद्रित खो देता है), जबकि SelectedValue गुण परिवर्तन जब भी उपयोगकर्ता एक आइटम का चयन करता है। ListControl नियंत्रण से

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

+0

मेरा से बेहतर जवाब। यह भी इंगित करना महत्वपूर्ण है कि जब आप चयनित वैल्यू से बंधे हैं तो आप चयनित इटैम का उपयोग नहीं कर पाएंगे क्योंकि इसे अभी तक अपडेट नहीं किया जाएगा। अगर मुझे सही याद है, तो आपको चयनित इंडेक्स द्वारा सूची नियंत्रण के आइटम संग्रह से पुनर्प्राप्त करना होगा। –

1

यदि आप चाहते हैं कि Selected.Value काम जरूरत

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

प्रमुख मुद्दा डेटास्रोत सेट है निम्नलिखित करते हैं!

0

हम यानी

<ComboBox SelectedValue="{Binding Pathology, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
           ItemsSource="{x:Static RnxGlobal:CLocalizedEnums.PathologiesValues}" DisplayMemberPath="Value" SelectedValuePath="Key" 
           Margin="{StaticResource SmallMarginLeftBottom}"/> 

एक शब्दकोश के लिए बाध्य करना चाहते हैं तो SelectedItem काम नहीं करेगा whilist SelectedValue होगा

संबंधित मुद्दे