सूची <T> बनाम बाइंडलिस्ट <टी> लाभ / अस्वीकरण


91

क्या कोई वर्णन कर सकता है कि मेरी परियोजना के लिए दोनों में क्या अंतर है।

वर्तमान में मेरे पास एक है List<MyClass>और उस पर एक बाइंडिंग सोर्स सेट कर रहा हूं और एक डेटाग्रिडिंग टू बाइंडिंगसोर्स।

मैंने इसे लागू IEditableObjectकर दिया है, जब CancelEdit कहा जाता है, मैंने अपनी वस्तु को वापस उसी के साथ वापस कर दिया है जो इसके साथ थाMemberwise.Clone()

क्या मेरी सूची को किसी बाइंडिंगलिस्ट में बदलना किसी भी समस्या का समाधान करेगा और बाइंडिंगलिस्ट का उपयोग करने के क्या फायदे हैं?

जवाबों:


123

List<>सहायक कार्यों के एक जोड़े के साथ A केवल एक स्वचालित रूप से आकार देने वाला सरणी है, दिए गए प्रकार की वस्तुओं का (जैसे: क्रमबद्ध)। यह सिर्फ डेटा है, और आप इसे अपने मॉडल में ऑब्जेक्ट के सेट पर संचालन चलाने के लिए उपयोग करने की संभावना रखते हैं।

BindingList<>टाइप सूची या संग्रह के आसपास एक आवरण है, जो IBindingListइंटरफ़ेस को लागू करता है। यह दो-तरफ़ा डेटाबाइंडिंग का समर्थन करने वाले मानक इंटरफ़ेस में से एक है। यह ListChangedईवेंट को कार्यान्वित करके काम करता है , जो आपके द्वारा आइटम जोड़ने, हटाने या सेट करने पर उठाया जाता है। बाध्य नियंत्रण इस घटना को सुनते हैं ताकि यह पता चल सके कि उनके प्रदर्शन को कब ताज़ा किया जाए।

जब आप एक से एक बाइंडिंगसोर्स का डेटा स्रोत सेट करते हैं List<>, तो यह आंतरिक रूप BindingList<>से आपकी सूची को लपेटने के लिए बनाता है । BindingList<>यदि आप इसे बाइंडिंगसोर्स से बाहर एक्सेस करना चाहते हैं, तो आप अपनी सूची को खुद से प्री-रैप करना चाह सकते हैं , लेकिन अन्यथा यह केवल एक ही है। BindingList<>आइटम बदलते समय आप विशेष व्यवहार को लागू करने के लिए विरासत में भी प्राप्त कर सकते हैं ।

IEditableObjectBindingSource द्वारा नियंत्रित किया जाता है। जब आप डेटा को किसी भी बाउंड कंट्रोल में बदलते हैं, तो यह किसी भी कार्यान्वयन ऑब्जेक्ट पर BeginEdit को कॉल करेगा। फिर आप बाइंडिंग सोर्स पर EndEdit / CancelEdit पर कॉल कर सकते हैं और इसे अपनी वस्तु के साथ पास कर देंगे। एक अलग पंक्ति में जाने से एंडएडिट भी कॉल करेगा।


वर्तमान में मेरी सूची <T> के साथ कॉलिंग रद्द करेंएडिट से आइटम को उसकी मूल स्थिति में वापस संपादित नहीं किया जाएगा इसलिए मैं क्लोन () का उपयोग क्यों करता हूं। क्या आप कह रहे हैं कि एक बाध्यकारी सूची मेरे लिए संभाल लेगी?
जॉन

3
नहीं, एक BindList का उस कार्यक्षमता से कोई लेना-देना नहीं है। BindingSource बस अंतर्निहित सूची के प्रकार की परवाह किए बिना वर्तमान वस्तु पर CancelEdit को कॉल करता है। वहाँ फ्रेमवर्क में कुछ भी नहीं है जो स्वचालित रूप से सादे वस्तुओं के लिए ऑब्जेक्ट संस्करण को लागू करता है। आप DataTables / DataRows का उपयोग कर सकते हैं, जो इस उद्देश्य के लिए डेटा की एक मूल प्रति रखते हैं।
एलेक्स जे

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

उदाहरण के लिए, डेटाग्रेड को यह जानना होगा कि नई पंक्ति जोड़ने के लिए आइटम को आपकी सूची में कब जोड़ा जाए। इसके लिए यह बाइंडिंगलिस्ट की लिस्टेड घटना का उपयोग करता है। यदि आप ग्रिड को सीधे एक सूची <T> में बाँध रहे थे, तो आपके पास घटना नहीं होगी, और सूची को बदलने पर ग्रिड को पता नहीं चल पाएगा। आपको अपने परिदृश्य में इसके बारे में चिंता करने की ज़रूरत नहीं है क्योंकि BindingSource आपके लिए एक बंधन में सूची <T> को लपेटता है। जब तक आप बाइंडिंग स्रोत के साथ काम करते हैं और जब तक सूची ही नहीं, तब तक नियंत्रण सिंक में रहेगा।
एलेक्स जे

क्या WPF UI (mvvm) के लिए बाइंडिंगलिस्ट का उपयोग करने के लिए कोई समाधान है? क्या मैं बाध्यकारी सूची को एक अवलोकन योग्य आवरण में लपेट सकता हूं?
लांस

12

एक बाइंडिंगलिस्ट घटनाओं का उपयोग करके दो-तरफ़ा डेटाबाइंडिंग की अनुमति देता है, एक सूची अपने संग्रह में परिवर्तन होने पर घटनाओं को आग नहीं लगाती है।

मुझे नहीं लगता कि यह आपकी विशेष समस्या को ठीक करेगा।

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