2009-01-18 17 views
22

मैंने पिछले दो वर्षों में कुछ डेटा आधारित विनफॉर्म एप्लिकेशन विकसित किए हैं और सभी ठीक काम करते हैं। यह एप्लिकेशन परतों (डेटाएप, बिजनेस लॉजिक और यूआई) पर बनाया गया है।अवलोकन योग्य चयन (टी) बनाम बाध्यकारी सूची (टी)?

Public MustInherit Class BaseEntity 
    Inherits SerializableObject 
    Implements IEntity 
    Implements IComparer, _ 
       IEditableObject, _ 
       INotifyPropertyChanging, INotifyPropertyChanged, _ 
       IApplicationSecurity 
    End Class 

ही कोर पुस्तकालय में: businness तर्क के लिए, मेरे सभी वस्तुओं निम्नलिखित परिभाषा (वहाँ कुछ कस्टम वस्तुओं और इंटरफेस, ढांचे तत्वों के साथ संयुक्त कर रहे हैं) के साथ BaseEntity नामक एक आधार वर्ग से विरासत , मेरे पास एक सामान्य आधार संग्रह BaseEntityCollection है। ये संग्रह मुझे डेटा आधारित अनुप्रयोगों में, प्रत्येक ऑब्जेक्ट के लिए, उनके संबंधित दृढ़ता से टाइप किए गए संग्रह को परिभाषित करने की अनुमति देता है, जो बहुत अंतरंग है। यहाँ यह आधार परिभाषा है है:

Public MustInherit Class BaseEntityCollection(Of T As BaseEntity) 
    Inherits BindingList(Of T) 
    Implements IEntityCollection 
    Implements INotifyPropertyChanged, INotifyPropertyChanging, ICopyable(Of T) 
    Implements IDisposable 
    Implements ISerializable 
    End Class 

आप देख सकते हैं, मैं सब सामान है कि Winforms में सही डेटा बाइंडिंग के लिए आवश्यक है का उपयोग करें: वस्तु के लिए

  • INotifyPropertyChanged, INotifyPropertyChanging, IEditableObject।
  • मेरे संग्रह के लिए बाइंडिंगलिस्ट (टी) पर आधारित एक संग्रह।

मैं नई प्रौद्योगिकियों पर भी हस्तक्षेप कर रहा हूं, इसलिए मैंने हाल ही में WPF के बारे में कुछ वेबकास्ट देखा है। इन वेबकास्ट में, वे संग्रह और डाटाबेसिंग समर्थन के लिए आधार वर्ग के रूप में उपयोग करते हैं ObservableCollection (टी)।

मैं यूआई परत के लिए Winforms से WPF तक अपने कुछ अनुप्रयोगों को माइग्रेट करने पर सोच रहा हूं।

मेरा प्रश्न है, मेरे व्यापार तर्क के लिए, क्या यह मेरे संग्रह को बाइंडिंगलिस्ट (टी) के आधार पर बेहतर रखता है या क्या मुझे अपना बेस संग्रह वर्ग बदलना चाहिए ताकि इसे ऑब्जर्जेबल कोलेक्शन (टी) से प्राप्त किया जा सके। मैं अपनी सभी परियोजनाओं के लिए एक अद्वितीय आधार संग्रह रखना चाहता हूं, जिसका उपयोग विनफॉर्म एप्लिकेशन, डब्ल्यूपीएफ एप्लीकेशन या एएसपी.नेट में भी किया जा सकता है। मैं अपनी परियोजनाओं में ऑब्जेक्ट्स के लिए लिंक का भी उपयोग कर रहा हूं, इसलिए मेरे पास केवल प्रोजेक्ट 2.0 पर आधारित मेरी परियोजनाओं को रखकर प्रतिबंध नहीं है।

धन्यवाद,

ClaBer

उत्तर

13

Claber,

मैं BindingList रखने, क्योंकि BindingList अधिक इंटरफेस और अधिक सुविधा ObservableCollection से अमीर का समर्थन करता है। उदाहरण के लिए:

  1. बाइंडिंगलिस्ट टी के आईएलआईस्ट लागू करता है, जबकि पर्यवेक्षण चयन नहीं करता है।
  2. बाइंडिंगलिस्ट आईसीएन्सेलएडन्यू इंटरफ़ेस लागू करता है जो डेटा बाध्यकारी तंत्र नए जोड़े गए आइटम को रद्द करने के लिए उपयोग करता है (जब आप DataGridView में पंक्ति जोड़ने के बाद भागने पर क्लिक करते हैं, तो पंक्ति समाप्त हो जाएगी)।

मैं स्वयं WPF के लिए बहुत नया हूं, और विशिष्ट लाभों को नहीं समझता है ObservableCollection ऑफ़र।

उम्मीद है कि इससे मदद मिलती है।

+0

'अवलोकन योग्य चयन' धागा सुरक्षित है, मुझे बाइंडिंगलिस्ट के बारे में पता नहीं है। – Shimmy

+10

यह सही नहीं है। माइक्रोसॉफ्ट के दस्तावेज स्पष्ट रूप से बताते हैं कि ऑब्जर्वेबल कोलेक्शन थ्रेड सुरक्षित नहीं है। http://msdn.microsoft.com/en-us/library/ms668604.aspx – kevindaub

+11

के बाद से ObservableCollection संग्रह विरासत और संग्रह को लागू करता है IList इंटरफ़ेस 1 बयान गलत है। –

13

मुझे लगता है कि अपने उत्तर में निहित है: http://xceed.com/CS/blogs/dontpanic/archive/2009/04/01/i-notify-we-notify-we-all-wait-no-we-don-t.aspx

कम होने के लिए, ObservableCollection अपने बच्चों में बदलाव के लिए नहीं सुनता लेकिन केवल डालें और घटनाओं निकालें।

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

आशा इस :)

--Bruno

+0

बाइंडिंगलिस्ट संग्रह के भीतर प्रत्येक आइटम (यह बच्चे, मुझे लगता है?) सुनता है क्योंकि यदि संग्रह में कोई आइटम बदलता है, तो बाइंडिंगलिस्ट उस संदेश को ग्रिड या उस सेल या मान को अपडेट करने के लिए नियंत्रण को पास करता है। इसका मतलब है कि पूरी पंक्ति को इसके मूल्यों को ताज़ा करने की आवश्यकता नहीं है। DataGridView के लिए विशिष्ट, यदि आप पंक्ति को रीफ्रेश करते हैं, न कि एक व्यक्तिगत सेल, जिस पंक्ति पर आप संपादन कर रहे हैं, तो आपके परिवर्तन दूर हो जाते हैं। यह सिर्फ आपकी जरूरतों पर निर्भर करता है। – TamusJRoyce

2

एक पुराने विषय के लिए मेरे दो सेंट जोड़ने में मदद मिलेगी:

जब एक WinForms DataGridView करने के लिए इन सामान्य संग्रह में से या तो बाध्यकारी डेटा और उसके बाद अद्यतन करने के गुण कई चयनित पंक्तियों के स्रोत डेटा में, आप देखेंगे:

  1. ObservableCollection<T> केवल हाल ही में सेलेक के सेल मान अपडेट करेगा टेड पंक्ति।
  2. BindingList<T> सभी चयनित पंक्तियों के सेल मान अपडेट करेगा।

मुझे लगता है कि उनमें से प्रत्येक के पास उनके फायदे और नुकसान हैं, लेकिन उपरोक्त उदाहरण उन लोगों के लिए गॉचा हो सकता है जो इससे अनजान हैं।

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