सेलेक्ट इटेम, सिलेक्टवैल्यू और सेलेवलवपथ के बीच अंतर


352

निम्नलिखित में क्या अंतर है:

ये सभी निर्भरता गुण चयनकर्ता वर्ग में परिभाषित किए गए हैं । मैं अक्सर SelectedItemसाथ SelectedValue, और SelectedValueसाथ भ्रमित करता हूं SelectedValuePath

मैं उनके बीच के अंतर को जानना चाहता हूं, और यह भी कि हम उनका उपयोग कब करते हैं, विशेष रूप से SelectedValueऔर SelectedValuePath। कृपया कुछ सरल उदाहरणों के साथ उनके उपयोग की व्याख्या करें ।


3
बीए में स्पष्टीकरण और नमूना कोड के साथ एक ब्लॉग पोस्ट है जिसे आप डाउनलोड कर सकते हैं ... bea.stollnitz.com/blog/?p=9
हारून मैकिवर

2
के संभावित डुप्लिकेट ([ComboBox DisplayMemberPath, SelectedValue और SelectedValuePath WPF के साथ उलझन] stackoverflow.com/questions/3797034/... )

जवाबों:


552

उनके नाम थोड़े भ्रमित हो सकते हैं :)। यहाँ एक सारांश है:

  • SelectedItem संपत्ति पूरे उद्देश्य यह है कि अपनी सूची के लिए बाध्य है देता है। तो कहते हैं कि आप एक सूची को Categoryवस्तुओं के संग्रह के लिए बाध्य करते हैं (प्रत्येक श्रेणी के नाम और आईडी गुण वाले)। जैसे। ObservableCollection<Category>SelectedItemसंपत्ति आप वर्तमान में चयनित वापस आ जाएगी Categoryवस्तु। बाध्यकारी उद्देश्यों के लिए, यह हमेशा वह नहीं है जो आप चाहते हैं, क्योंकि यह केवल आपको उस संपत्ति के लिए एक पूरी श्रेणी वस्तु को बांधने में सक्षम बनाता है जो उस सूची में बंधी है, उस श्रेणी की वस्तु पर एक भी संपत्ति का मूल्य नहीं है (जैसे कि उसकी IDसंपत्ति )।

  • इसलिए हमारे पास बाइंडिंग के वैकल्पिक साधन के रूप में SelectValuePath प्रॉपर्टी और सिलेक्टवैल्यू प्रॉपर्टी है (आप उन्हें एक दूसरे के साथ मिलाकर उपयोग करते हैं)। मान लीजिए कि आपके पास एक Productवस्तु है, जिससे आपका दृष्टिकोण उत्पाद के नाम (वजन, आदि) के गुणों के साथ है। मान लें कि आपके पास CategoryIDउस उत्पाद ऑब्जेक्ट पर एक संपत्ति है, और आप चाहते हैं कि उपयोगकर्ता श्रेणियों की सूची से उत्पाद के लिए एक श्रेणी का चयन करने में सक्षम हो। आपको CategoryIDउत्पाद ऑब्जेक्ट पर श्रेणी को दी जाने वाली श्रेणी ऑब्जेक्ट की ID गुण की आवश्यकता है । यह वह जगह है जहाँ SelectedValuePathऔरSelectedValueगुण आते हैं। आप निर्दिष्ट करते हैं कि श्रेणी वस्तु पर आईडी संपत्ति को उस उत्पाद वस्तु पर संपत्ति को सौंपा जाना चाहिए जो सूची का उपयोग करने के लिए बाध्य है SelectedValuePath='ID', और फिर SelectedValueसंपत्ति को DataContext (यानी उत्पाद) पर संपत्ति से बांधें ।

नीचे दिया गया उदाहरण यह प्रदर्शित करता है। हमारे पास श्रेणियों की एक सूची (आइटम स्रोत के माध्यम से) एक कॉम्बो बॉक्स है। हम चयनित मूल्य के रूप में उत्पाद पर (चयनितValue संपत्ति का उपयोग करके) श्रेणीबद्ध संपत्ति को बाध्य कर रहे हैं। हम इसे सेलेक्टवैलपैथ प्रॉपर्टी के जरिए कैटेगरी की आईडी प्रॉपर्टी से संबंधित कर रहे हैं। और हम कह रहे हैं कि केवल ComboBox में DisplayMemberPath संपत्ति के साथ नाम संपत्ति प्रदर्शित करें)।

<ComboBox ItemsSource="{Binding Categories}" 
          SelectedValue="{Binding CategoryID, Mode=TwoWay}" 
          SelectedValuePath="ID" 
          DisplayMemberPath="Name" />
public class Category
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class Product
{
    public int CategoryID { get; set; }
}

यह शुरू में थोड़ा भ्रमित करने वाला है, लेकिन उम्मीद है कि यह इसे थोड़ा स्पष्ट करता है ... :)

क्रिस


8
स्पष्टीकरण के लिए धन्यवाद। क्या आप वही आदमी हैं जिसने सिल्वरलाइट पर किताब लिखी है? मुझे विश्वास नहीं होता कि मैं आपसे बात कर रहा हूं। : -) ... मैं आजकल यह किताब पढ़ रहा हूँ। वाकई कमाल का काम है। :-)
नवाज़

22
हां, यह मैं :)। जब मैं कर सकता हूँ तो मैं सवालों के जवाब देने के लिए इन भागों के चारों ओर लटका रहता हूँ। खुशी है कि आप पुस्तक का आनंद ले रहे हैं :)। जब से आपको पुस्तक मिली है, आपको इस विषय पर अधिक जानकारी पेज 69-70 और पेज 204 पर मिलेगी।
क्रिस एंडरसन

8
+1। +100। आप, श्रीमान, कम आदमियों के बीच एक स्वर्ण देवता हैं। ईश्वर आपको आशीर्वाद दे, और आप में सभी पाल लें। :) गंभीरता से, मैंने अभी दो घंटे बिताए हैं कि यह पता लगाने की कोशिश कर रहा हूँ - धन्यवाद!
तारकडाल

1
@ क्रिस एंडरसन: क्या होगा यदि उत्पाद वस्तु की श्रेणी श्रेणी के बजाय श्रेणी संपत्ति (प्रकार श्रेणी) है? बाध्यकारी के माध्यम से मैं इस श्रेणी की संपत्ति को कॉम्बो बॉक्स के परिवर्तन पर कैसे अपडेट कर सकता हूं?
लूसिफ़ेर

2
@Lucifer: इस मामले में आप चयनित संपत्ति का उपयोग इस तरह करेंगे: <ComboBox ItemSource = "{बाइंडिंग श्रेणियां}" चयनित इटिम = "{बाइंडिंग श्रेणी, मोड = टूवे}" /> आशा है कि यह मदद करता है।
क्रिस एंडरसन

69

वैचारिक रूप से थोड़ा और जवाब देने के लिए:

SelectedValuePathयह निर्धारित करता है कि ListBox के लिए बाध्य वस्तुओं के कौन से गुण (इसके नाम से) का ItemsSourceउपयोग आइटम के रूप में किया जाएगा SelectedValue

उदाहरण के लिए, यदि आपके ListBox का एक संग्रह के लिए बाध्य है Personवस्तुओं, जिनमें से प्रत्येक है की Name, Ageहै, और Genderगुण, SelectedValuePath=Nameचयनित मूल्य का कारण होगा Personकी Nameसंपत्ति में वापस करने SelectedValue

ध्यान दें कि यदि आप ListBox के ControlTemplate को ओवरराइड करते हैं (या एक स्टाइल लागू करते हैं) जो निर्दिष्ट करता है कि संपत्ति क्या प्रदर्शित होनी चाहिए, SelectedValuePathइसका उपयोग नहीं किया जा सकता है।

SelectedItem, इस बीच, Personवर्तमान में चयनित पूरी वस्तु लौटाता है ।

(यहां ट्री व्यू का उपयोग करते हुए MSDN से एक और उदाहरण दिया गया है )

अद्यतन: जैसा कि @ जो ने बताया, DisplayMemberPath गुण चयनित * गुणों से असंबंधित है। इसका उचित विवरण इस प्रकार है:

ध्यान दें कि ये मान अलग-अलग हैं DisplayMemberPath(जो कि आइटमकंट्रोल पर परिभाषित किया गया है, चयनकर्ता नहीं), लेकिन उस संपत्ति के लिए समान व्यवहार है SelectedValuePath: शैली / टेम्पलेट की अनुपस्थिति में, यह पहचानता है कि आइटम के लिए बाध्य वस्तु की किस संपत्ति का उपयोग उसके रूप में किया जाना चाहिए स्ट्रिंग प्रतिनिधित्व।


8

SelectedItemएक है objectSelectedValueऔर SelectedValuePathहैं string

उदाहरण के लिए सूची बॉक्स का उपयोग कर:

यदि आप कहते हैं कि मुझे दे दो तो listbox1.SelectedValueयह वर्तमान में चयनित आइटम का पाठ वापस कर देगा।

string value = listbox1.SelectedValue;

यदि आप कहते हैं कि मुझे दे दो तो listbox1.SelectedItemयह आपको पूरी वस्तु दे देगा।

ListItem item = listbox1.SelectedItem;
string value = item.value;

3
SelectedValueएक भी है objectऔर एक नहीं है string। Pls यहां
john_m

5

इस प्रश्न से प्रेरित होकर मैंने यहाँ कोड स्निपेट के साथ एक ब्लॉग भी लिखा है । नीचे ब्लॉग के कुछ अंश दिए गए हैं

SelectItem - चयनित आइटम DataSource से वास्तविक मूल्य को बांधने में मदद करता है जिसे प्रदर्शित किया जाएगा। यह टाइप ऑब्जेक्ट का है और हम इस प्रॉपर्टी के साथ ऑब्जेक्ट टाइप से प्राप्त किसी भी प्रकार को बांध सकते हैं। चूंकि हम उस स्थिति में अपने कॉम्बो बॉक्स के लिए एमवीवीएम बाइंडिंग का उपयोग कर रहे हैं, यह वह संपत्ति है जिसका उपयोग हम वीएम को सूचित करने के लिए कर सकते हैं कि आइटम का चयन किया गया है।

चयनितवैल्यू और चयनितवैल्यूपैथ - ये दो सबसे भ्रामक और गलत व्याख्या की गई संपत्तियां हैं। लेकिन इन गुणों का बचाव तब होता है जब हम पहले से बनाई गई वस्तु से मूल्य के साथ अपने कॉम्बोक्स को बांधना चाहते हैं। गुणों के बारे में संक्षिप्त जानकारी प्राप्त करने के लिए कृपया निम्नलिखित सूची में मेरे अंतिम परिदृश्य को देखें।


1

डेटा को स्टोर करने के लिए कलेक्शंस का उपयोग करने वाले प्रत्येक नियंत्रण में चयनितवैल्यू, सेलेक्ट इटेम प्रॉपर्टी है। इन नियंत्रणों के उदाहरण ListBox, Dropdown, RadioButtonList, CheckBoxList हैं।

अधिक विशिष्ट होने के लिए यदि आप सचमुच चयनित आइटम का पाठ पुनर्प्राप्त करना चाहते हैं तो आप लिख सकते हैं:

ListBox1.SelectedItem.Text;

यदि आपका मान इससे पहले सेट हो गया है, तो आपका ListBox1 SelectValue प्रॉपर्टी का उपयोग करके भी टेक्स्ट वापस कर सकता है। लेकिन ऊपर पाठ पाने के लिए अधिक प्रभावी तरीका है।

अब, मूल्य कुछ ऐसा है जो उपयोगकर्ता को दिखाई नहीं देता है लेकिन इसका उपयोग ज्यादातर डेटाबेस में संग्रहीत करने के लिए किया जाता है। हम ListBox1 का पाठ सम्मिलित नहीं करते हैं, हालांकि हम इसे भी सम्मिलित कर सकते हैं, लेकिन हम चयनित आइटम का मूल्य सम्मिलित करते थे। मूल्य प्राप्त करने के लिए हम उपयोग कर सकते हैं

ListBox1.SelectedValue

स्रोत

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.