2013-08-14 4 views
7

मैंने Google और यहां जवाब के लिए खोज की है, मेरी समस्या कुछ हद तक नीचे दिए गए प्रश्न से संबंधित है, लेकिन एक नया प्रश्न वारंट करने के लिए काफी अलग है।डब्ल्यूपीएफ: कम्बोबॉक्स बाध्य मदरसोर्स संग्रह के बाद चयनित इंडेक्स खोना

Combo-box loses selection after collection changes

मूल रूप से, मैं एक WPF बता गया है जो एक ObservableCollection वर्ग के लिए बाध्य कर रहा है। इस वर्ग में संग्रह परिवर्तन अधिसूचनाओं में देरी करने के लिए अतिरिक्त कार्यक्षमता है यदि मुझे इसमें कई बदलाव करने की आवश्यकता है, जैसे डेटाबेस को ताज़ा स्नैपशॉट प्राप्त करने के लिए इसे साफ़ करना और उसे भरना।

मेरा combobox बाध्यकारी दोनों DisplayMemberPath और SelectedValuePath सेट है। SelectedValuePath एक पूर्णांक संपत्ति का समाधान करता है।

समस्या संदर्भित प्रश्न के समान है, जब मैं बाध्य संग्रह में मान ताज़ा करता हूं, बाध्य कॉम्बोबॉक्स इसके चयन को खो देता है, और खाली (चयनित इंडेक्स = -1) चला जाता है।

मैं पुष्टि कर सकता हूं कि कलेक्शन चेंजेड ईवेंट तब तक नहीं निकाल दिया जाता जब तक कि संग्रह फिर से पॉप्युलेट नहीं हो जाता है और इसमें आइटम वापस आते हैं।

अधिक पेचीदा अगर मैं निम्न कार्य है:

 using (_collection.DelayNotifications()) 
     { 
      var items = _collection.ToArray(); 
      _collection.Clear(); 
      _collection.AddRange(items); 
     } 

बता गया नहीं उसकी चयनित मूल्य खो करता है।

जो बताता है कि संग्रह में आइटम डेटाबेस से पुनर्प्राप्त नई वस्तुओं के साथ प्रतिस्थापित हो जाते हैं - अगर मैं चयनित वैल्यूपैथ बाध्यकारी का उपयोग नहीं कर रहा था, तो मैं इसे स्वीकार कर सकता हूं, लेकिन क्योंकि मैं हूं, और क्योंकि पूर्णांक मान हैं वही, निश्चित रूप से मैं क्या कर रहा हूँ काम करना चाहिए?

मैं .NET 3.5 का उपयोग कर रहा SP1

किसी को भी किसी भी विचार है?

संपादित

नीचे टिप्पणी से और Blam का जवाब। मैं स्वीकार करता हूं कि कारण क्यों कर रहे हैं। लेकिन यह वास्तव में मेरी मदद नहीं करता है।

मैं अपने दृश्य मॉडल पर एक एकीकृत संपत्ति में Combobox की चयनित वैल्यू संपत्ति को बाध्य कर रहा हूं। अगर मैं चयनित इटैम को बांधना चाहता था, तो मुझे अपने ऑब्जेक्ट मॉडल पर उस ऑब्जेक्ट प्रकार की संपत्ति से जुड़ना होगा - लेकिन यह वास्तव में पूर्णांक संपत्ति है।

फिलहाल मैंने संपत्ति को 'फिक्स्ड वैल्यू' संपत्ति के लिए एक संपत्ति बदलती घटना को मजबूर कर "फिक्स्ड" (मामूली हैक पढ़ें) को जारी किया है। ऐसा लगता है कि कम्बोबॉक्स एक आइटम के लिए अपनी आंतरिक सूची को फिर से जांचता है जो परिभाषित चयनित वैल्यूपैथ पर मेल खाता है।

डब्ल्यूपीएफ कम्बोबॉक्स को 'पता' होना चाहिए कि इसमें एक चयनित वैल्यूपैथ वैल्यू सेट है, इसलिए मुझे लगता है कि यह एक लीप से बहुत दूर नहीं लगता है कि यह अपने आइटम मिलान तर्क को समायोजित करेगा। हालांकि यह दायरे के बाहर जा रहा है एसओ के लिए इरादा है।

मुझे एहसास है कि मैं शायद यह स्वीकार करने जा रहा हूं कि डब्ल्यूपीएफ कैसे काम करता है, लेकिन कुछ वर्षों तक WinForms में डेटा-बाध्य comboboxes के साथ लड़ने के बाद, मुझे उम्मीद थी कि मुझे WPF के साथ नहीं करना होगा :) - हालांकि यह कह रहा है कि डब्ल्यूपीएफ कम्बोबॉक्सिस WinForm के मुकाबले कहीं ज्यादा बेहतर हैं।

+0

वैल्यूपैथ कोई फर्क नहीं पड़ता कि यह एक अलग वस्तु है ... आप बाइंडिंग को पकड़ने की उम्मीद नहीं कर सकते क्योंकि यह विशिष्ट बीमा (ऑब्जेक्ट्स) के लिए बाध्यकारी है। एक बार जब आप उन्हें हटा देते हैं, बाध्यकारी खो जाता है ... – UIlrvnd

+0

DelayNotificatons() द्वारा लौटाई गई ऑब्जेक्ट का निपटान विधि ListReset ध्वज के साथ संग्रह परिवर्तन ईवेंट को बढ़ाता है। मैं अब भी मानता हूं कि कम्बोबॉक्स एक पूर्णांक मूल्य के लिए इसकी नई सूची को देखेगा, जिस पर यह मिलान हो सकता है ... यदि ऐसा नहीं होता है, तो मेरे विकल्प क्या हैं? – Marlon

+0

अपने कोड उदाहरण में आप एक ही उदाहरण का उपयोग करते हैं, क्योंकि केवल एक चीज जिसे आप जोड़ते हैं संग्रह हैं। यह तब तक नहीं देखेगा जब पूर्णांक एक अलग उदाहरण है, भले ही ** ** ** एक ही मूल्य है ... उम्मीद है कि यह sence lol बनाता है ... – UIlrvnd

उत्तर

4

यह बयान गलत

अगर मैं SelectedValuePath बंधन का उपयोग नहीं किया गया था, मैं यह स्वीकार करते हैं सकता है लेकिन क्योंकि मैं

हूँ आप SelectedValuePath के लिए बाध्य नहीं हैं।
आप ऑब्जेक्ट्स के संग्रह के लिए बाध्यकारी हैं।
चयनित वैल्यूपैथ सिर्फ रिपोर्टिंग के लिए समानता के लिए वस्तुओं की तुलना करने के लिए कुछ भी नहीं है। डिस्प्ले मेम्बरपैथ सिर्फ रिपोर्टिंग के लिए समानता के लिए वस्तुओं की तुलना करने के लिए कुछ भी नहीं है।

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

SelectedValuePath के प्रलेखन से:

हो जाता है या रास्ता है कि SelectedItem से SelectedValue प्राप्त करने के लिए प्रयोग किया जाता है निर्धारित करता है।

नमूना है कि confuses आप आप में वापस ही वस्तुओं लोड कर रहे हैं में।

मैं SelectedValuePath ग्रहण करने के लिए जा रहा हूँ एक संपत्ति नामित आईडी

है, तो आप स्पष्ट और एक आईडी के साथ एक वस्तु को पुन: 6 में यह 6 की आईडी के साथ साफ़ ऑब्जेक्ट के बराबर नहीं है।

इसे आजमाएं। 6 की आईडी के साथ दो ऑब्जेक्ट्स (ओ 1 और ओ 2) बनाएं और ओ 1 की तुलना करें। एक्वाल्स (ओ 2)।

यदि आप 6 की आईडी के साथ दो ऑब्जेक्ट्स बराबर होना चाहते हैं तो आपको GetHashCode और Equals को ओवरराइड करना होगा। बराबर में वापस लौटें यदि दोनों के पास 6 की आईडी है और आप आईडी को GetHashCode के रूप में उपयोग कर सकते हैं।

स्ट्रिंग एक संदर्भ प्रकार है जो आपको मूर्ख बना देगा।
स्ट्रिंग एस 1 = "बिल्ली";
स्ट्रिंग एस 2 = "बिल्ली";
s1.Equals (s2) सत्य वापस आ जाएगा क्योंकि स्ट्रिंग इक्विल्स को मूल्य की तुलना करने के लिए ओवरराइड किया गया है।

+0

हाँ मैं इसे समझता हूं, लेकिन मैं ' मैं चयनित Item के लिए बाध्यकारी नहीं है, मैं चयनित Value के लिए बाध्यकारी हूँ। इसलिए मैं कॉम्बोबॉक्स को चयनित इटैम पर समानता की तुलना करने की अपेक्षा नहीं करता।हालांकि मुझे लगता है कि यह वास्तव में निर्धारित नहीं कर सकता कि किसी ने किस संपत्ति को बाध्य किया है और सूट में अपने आंतरिक तर्क को समायोजित किया है। – Marlon

+0

स्टीफन द्वारा मेरे उत्तर और टिप्पणी में शामिल किए गए अनुसार आप चयनित वैल्यू के लिए बाध्यकारी नहीं हैं। आप वस्तुओं के संग्रह के लिए बाध्यकारी हैं। DisplayMemberPath और SelectedValuePath केवल रिपोर्टिंग के लिए हैं। यह जवाब है। इसे लागू करने के बजाय आप इसे क्यों अस्वीकार करते हैं? – Paparazzi

+0

मैं इसे अस्वीकार नहीं कर रहा हूं - मैं सिर्फ यह बता रहा हूं कि मैं क्या कर रहा हूं। मुझे नहीं लगता कि मेरा तर्क बेकार था। प्रश्न में मेरा संपादन देखें। मैं इसे कुछ दिन देने जा रहा हूं लेकिन मैं शायद आपका जवाब स्वीकार करने जा रहा हूं। – Marlon

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