ओब्जर्वैबल कॉलेक्शन और बाइंडिंगलिस्ट के बीच अंतर


236

मैं इस अंतर को जानना चाहता हूं ObservableCollectionऔर BindingListक्योंकि मैंने स्रोत में किसी भी ऐड / डिलीट परिवर्तन के लिए सूचित करने के लिए दोनों का उपयोग किया है, लेकिन मैं वास्तव में नहीं जानता कि कब एक दूसरे को पसंद करना है।

मैं दूसरे में से एक को क्यों चुनूंगा?

ObservableCollection<Employee> lstEmp = new ObservableCollection<Employee>();

या

BindingList<Employee> lstEmp = new BindingList<Employee>();

जवाबों:


278

एक ObservableCollectionवास्तव में किसी भी संग्रह की तरह यूआई से अद्यतन किया जा सकता। असली अंतर सीधा नहीं है:

ObservableCollection<T>INotifyCollectionChangedसंग्रह को परिवर्तित करने पर अधिसूचना जो प्रदान करती है (आपने अनुमान लगाया गया है ^ ^) यह बाध्यकारी इंजन को यूआई अद्यतन करने की अनुमति देता है जब ObservableCollectionवह अद्यतन किया जाता है।

हालाँकि, BindingList<T>लागू करता है IBindingList

IBindingListसंग्रह परिवर्तन पर अधिसूचना प्रदान करता है, लेकिन केवल यही नहीं। यह कार्यक्षमता का एक पूरा गुच्छा प्रदान करता है जिसका उपयोग यूआई द्वारा परिवर्तनों के अनुसार केवल UI अपडेट की तुलना में बहुत अधिक चीजें प्रदान करने के लिए किया जा सकता है, जैसे:

  • छंटाई
  • खोज कर
  • कारखाने के माध्यम से जोड़ें (AddNew सदस्य फ़ंक्शन)।
  • आसानी से सूची (संपत्ति संपत्ति)

ये सभी कार्य में उपलब्ध नहीं हैं ObservableCollection<T>

एक और अंतर यह है कि BindingListजब आइटम लागू होता है तो आइटम परिवर्तन सूचनाओं को रिले करता है INotifyPropertyChanged। यदि कोई आइटम किसी PropertyChangedघटना को उठाता है , तो BindingListवसीयत उसे एक के ListChangedEventसाथ उठाती है ListChangedType.ItemChangedऔर OldIndex=NewIndex(यदि एक आइटम को बदल दिया गया था OldIndex=-1)। ObservableCollectionआइटम सूचनाओं को रिले नहीं करता है।

ध्यान दें कि सिल्वरलाइट में, BindingListएक विकल्प के रूप में उपलब्ध नहीं है: आप हालांकि ObservableCollectionएस और ICollectionView(और IPagedCollectionViewअगर मुझे अच्छी तरह से याद है) का उपयोग कर सकते हैं ।


5
विचार करने के लिए एक और बात प्रदर्शन है, देखें: themissingdocs.net/wordpress/?p=465
मज़ूर

धन्यवाद, मुझे बाइंडिंगलिस्ट के वास्तविक कार्यान्वयन के बारे में पता नहीं था। मैं
ऑब्जर्वेबल कॉलेक्शन

5
हालांकि इस उत्तर की जानकारी सही है, किसी भी WPF उपयोगकर्ताओं को सावधान रहना चाहिए: BindingList INotifyCollectionChanged को कार्यान्वित नहीं करता है और एक नियंत्रण के ItemSource गुण के लिए बाध्य होने पर स्मृति रिसाव का कारण होगा। ऑब्ज़र्वेबल कॉलेक्शन इंटरफ़ेस को लागू करता है और इस तरह के किसी भी लीक का कारण नहीं होगा।
ब्रैंडन हुड

1
यदि बाइंडिंगलिस्ट छँटाई करता है, तो आप एक बाइंडिंगलिस्ट से बंधे हुए ग्रिड को क्यों नहीं छाँट सकते?
रॉबर्ट हार्वे

है BindingListअप्रचलित?
बजे शमी वेइटहैंडलर

27

व्यावहारिक अंतर यह है कि बाइंडिंगलिस्ट WinForms के लिए है, और ऑब्जर्वेबल काबिलेक्शन WPF के लिए है।

WPF के नजरिए से, BindingList ने सही तरीके से समर्थन नहीं किया है, और जब तक आप वास्तव में नहीं होते तब तक आप वास्तव में WPF प्रोजेक्ट में इसका उपयोग कभी नहीं करेंगे।


1
दिलचस्प। एक सिल्वरलाइट देव के रूप में, मुझे नहीं पता था कि। धन्यवाद। और यदि आप छँटाई और छानना चाहते हैं, तो ICollectionView कार्यान्वयन आपके मित्र हैं ^ ^
इलिस्ट्राई

27
यह "समर्थित नहीं" क्यों है? ViewManager (आंतरिक) PresentationFramework असेंबली के भीतर है और जो इसका समर्थन करता है। उदाहरण के लिए इसे एक ItemControl से बाँधें और परिवर्तन सूचनाओं का सम्मान किया जाता है (अर्थात आइटम जोड़े और हटाए जाते हैं)। यदि यह WinForms विशिष्ट थे, तो क्या इसे प्रपत्र नामस्थान में बेहतर नहीं रखा जाना चाहिए?
डेविड कीफ

7
डेविड के साथ सहमत, यह System.Collections नामस्थान में है, इसलिए इसे WPF द्वारा पूरी तरह से समर्थित होना चाहिए। WPF UI लेआउट का एक अलग तरीका है।
जस्टिन

13
डेविड के साथ भी सहमत हूं, मैं अक्सर WPF में बाइंडिंगलिस्ट का उपयोग करता हूं क्योंकि ऑब्जर्वेबलकोलेक्शनियन अपने आइटम से संपत्ति परिवर्तन सूचनाओं को बुलबुला नहीं करेगा।
अमनेशिया

3
"सपोर्ट नहीं" के लिए एक उदाहरण देने के लिए: मुझे बस अपने WPF एप्लिकेशन में एक मेमोरी लीक मिली, जो कि कुछ बाइंडलीस्ट द्वारा INotifyCollectionChanged को लागू नहीं करने के कारण होती है
ब्रीज

4

सबसे महत्वपूर्ण अंतर जैसे सुविधाएँ और निहित तत्वों के बारे में सूचनाएं पहले से ही स्वीकृत उत्तर द्वारा उल्लिखित हैं, लेकिन और भी हैं, जो उल्लेख के लायक भी हैं:

प्रदर्शन

जब AddNewकहा जाता है, BindingList<T>एक IndexOfखोज द्वारा जोड़े गए आइटम के लिए खोज करता है। और यदि एक बदले हुए तत्व के सूचकांक को भी Tलागू INotifyPropertyChangedकिया जाता है IndexOf(हालांकि एक ही वस्तु को बार-बार बदलने के बाद भी कोई नया लुकअप नहीं होता है)। यदि आप संग्रह में हजारों तत्वों को संग्रहीत करते हैं, तो ObservableCollection<T>(या IBindingListओ (1) लुकअप लागत के साथ एक कस्टम कार्यान्वयन) अधिक बेहतर हो सकता है।

संपूर्णता

  • IBindingListइंटरफ़ेस एक बहुत बड़ा एक (शायद नहीं साफ डिजाइन) है और कार्यान्वयन अपनी सुविधाओं का केवल एक सबसेट को लागू करने की अनुमति देता है। उदाहरण के लिए, AllowNew, SupportsSortingऔर SupportsSearchingगुण है कि क्या बता AddNew, ApplySortऔर Findतरीकों क्रमश: इस्तेमाल किया जा सकता। यह अक्सर लोगों को आश्चर्यचकित BindingList<T>करता है कि स्वयं छँटाई का समर्थन नहीं करता है। वास्तव में यह कुछ आभासी तरीके प्रदान करता है जिससे व्युत्पन्न वर्ग गायब सुविधाओं को जोड़ते हैं। DataViewवर्ग एक पूर्ण के लिए एक उदाहरण है IBindingListकार्यान्वयन; हालाँकि, यह पहली बार में टाइप किए गए संग्रह के लिए नहीं है। और BindingSourceWinForms में वर्ग एक हाइब्रिड उदाहरण है: यह छँटाई का समर्थन करता है यदि यह दूसरे IBindingListकार्यान्वयन को लपेटता है, जो छँटाई का समर्थन करता है।

  • ObservableCollection<T>पहले से ही INotifyCollectionChangedइंटरफ़ेस का पूर्ण कार्यान्वयन है (जिसमें केवल एक घटना है)। इसमें वर्चुअल सदस्य भी हैं, लेकिन ObservableCollection<T>आम तौर पर इसके आधार Collection<T>वर्ग के समान कारण के लिए व्युत्पन्न किया गया है : बाध्यकारी सुविधाओं को समायोजित करने के बजाय आइटम जोड़ने / हटाने (जैसे एक डेटा मॉडल संग्रह में) को अनुकूलित करने के लिए।

नकल बनाम लपेटकर

दोनों ObservableCollection<T>और BindingList<T>एक निर्माता है, जो पहले से मौजूद किसी सूची को स्वीकार करता है। यद्यपि वे दूसरे संग्रह द्वारा त्वरित रूप से व्यवहार करते हैं:

  • BindingList<T>प्रदान की गई सूची के लिए एक नमूदार आवरण के रूप में कार्य करता है , और BindingList<T>वसीयत पर किए गए परिवर्तन अंतर्निहित संग्रह पर भी दिखाई देंगे।
  • ObservableCollection<T>दूसरी ओर List<T>, बेस Collection<T>कंस्ट्रक्टर के लिए एक नया उदाहरण देता है और मूल संग्रह के तत्वों को इस नई सूची में कॉपी करता है। बेशक, अगर Tएक संदर्भ प्रकार है तो तत्वों पर परिवर्तन मूल संग्रह से दिखाई देगा, लेकिन संग्रह खुद को अपडेट नहीं किया जाएगा।

1

एक और बड़ा अंतर के बीच ObservableCollectionऔर BindingListहै कि काम आता है, और विषय पर एक बोली निर्णय कारक हो सकता है:

BindingList सूची बदलें हैंडलर:

बाइंडलिस्ट सूची बदलें

ObservableCollection संग्रह परिवर्तन:

ऑब्ज़र्वेबल कलैक्शन कलेक्शन बदल गया

ऊपर का संक्षिप्त विवरण: यदि किसी वस्तु की संपत्ति में बदलाव किया जाता है BindingList, तो ListChangedघटना आपको संपत्ति का पूरा विवरण देगी (प्रॉपर्टीस्क्रिप्ट में) और ObservableCollectionआपको वह नहीं देगी। वास्तव ObservableCollectionमें एक आइटम में परिवर्तित संपत्ति के लिए परिवर्तन घटना नहीं बढ़ाएगा।

उपरोक्त निष्कर्ष INotifyPropertyChangedमॉडल कक्षाओं में कार्यान्वित किए जाने के संबंध में हैं। डिफ़ॉल्ट रूप से कोई भी परिवर्तित घटना को नहीं बढ़ाता है यदि किसी आइटम में कोई संपत्ति बदली जाती है।


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