2012-03-05 11 views
11

संभावित AddRange या RemoveRange की तरह एक ObservableCollection समर्थन आपरेशन के कारण समस्याओं क्या हैं? माइक्रोसॉफ्ट ने उन्हें प्रदान नहीं करने का एक कारण होना चाहिए, अब ऑब्जेर्जेबल कोलेक्शन का उपयोग अक्सर WPF के साथ किया जाता है।पर्यवेक्षण चयन क्यों बड़े बदलावों का समर्थन नहीं करता है?

आप अपनी खुद की संग्रह है कि थोक आपरेशनों का समर्थन करता है और INotifyCollectionChanged लागू करता है को लागू कर सकते हैं। यदि मैं आइटम्स कंट्रोल पर ऐसा नियंत्रण बांधता हूं तो क्या होगा?

किसी ItemsControls कि बल्क परिवर्तन का समर्थन नहीं करते पता है?

+6

वहाँ Microsoft.VisualStudio.Language में एक BulkObservableCollection वर्ग है मिलेगा है कि बाँध। Intellisense.BulkObservableCollection http://msdn.microsoft.com/en-us/library/dd867973.aspx – tofutim

उत्तर

3

मैं इसे किसी भी संभावित कमियां या समस्याओं देखते हैं कि है नहीं लगता है, यह सिर्फ है कि यह वहाँ नहीं है। वास्तव में, आप पाएंगे कि 'System.Collections.Generic' में अधिकांश प्रकार या तो 'AddRange' कार्यक्षमता की आपूर्ति नहीं करते हैं।

इस बीच, बहुत से लोग 'ObservableCollection' का अपना संस्करण बनाया है कार्यक्षमता है कि आप चाहते हैं प्रदान करते हैं।INotifyCollectionChanged इसके संचालकों जब मदों की एक श्रृंखला इस कारण के लिए शायद प्रभावित हुए हैं का ध्यान रखें करने के लिए पर्याप्त जानकारी है।

इतना ही नहीं बल्कि, यदि आप एक संग्रह 'इन' सीमा 'प्रकार संचालन आपको लगता है कि वे अपने यूआई के साथ काम करेंगे के रूप में आप उम्मीद कर

4

ObservableCollection पर कई एक्सटेंशन हैं जो इंटरनेट पर पाए जा सकते हैं जो जोड़ने/निकालने की रेंज की अवधारणा को जोड़ते हैं, या आपको अद्यतनों को स्थगित करने और उन्हें मैन्युअल रूप से आग लगाने की अनुमति देते हैं।

:

ObservableCollection Doesn't support AddRange method, so I get notified for each item added, besides what about INotifyCollectionChanging?

तुम भी एक थोक ऐड कि एक रीसेट ईवेंट सक्रिय है, जो यूआई संग्रह में आइटम के सभी फिर से प्रस्तुत करने के लिए कारण होगा लागू कर सकते हैं: उदाहरण के लिए इस स्टैक ओवरफ़्लो प्रश्न देखें

http://peteohanlon.wordpress.com/2008/10/22/bulk-loading-in-observablecollection/

ये आपको यूआई अपडेटों को अधिक कुशलतापूर्वक प्रबंधित करने की अनुमति देते हैं। कैसे एक ItemsControl एक संग्रह परिवर्तित घटना को संभालता है जो बताता है कि बदली गई वस्तुओं की एक सूची WPF ढांचे पर ही है। मुझे लगता है कि यह बुद्धिमानी से संभालता है! अगर प्रदर्शन आप के लिए महत्वपूर्ण है और आप कई वस्तुओं के साथ संग्रह अपडेट किया जा रहा है और, फिर उपवर्ग ObservableCollection संग्रह एक तरह से सबसे अच्छा आपके आवेदन की जरूरतों फिट बैठता है कि में अधिसूचना बदल प्रबंधन करने के लिए प्रदर्शन समस्या का सामना कर रहे

आप के लिए मेरी सलाह है।

+0

जुड़ा हुआ सवाल के कार्यान्वयन पर एक त्वरित नज़र एक अक्षम कार्यान्वयन को दर्शाता है। असल में, संग्रहित रीसेट करने के लिए फिर से संग्रहित करने के लिए 'संग्रह परिवर्तन' ईवेंट उठाया जाता है! –

+1

@KentBoogaart हाय केंट, आप तो जवाब मतलब हैं? मुझे ठीक लग रहा है। से अधिक आइटम AddRange विधि दोहराता जोड़ा तो का जोड़ा आइटमों की सूची की आपूर्ति 'जोड़ें' एक परिवर्तन प्रकार के साथ एक एकल CollectionChanged ईवेंट सक्रिय,। हालांकि कोड का स्वरूपण इतना अच्छा नहीं है ;-) – ColinE

+1

रेंज ऑब्सर्जेबल कोलेक्शन अवलोकननीय कोलेक्शन बढ़ाता है, कॉलिंग चेंजएडेंट में प्रत्येक आइटम परिणामों को जोड़कर प्रत्येक आइटम जोड़ा जाता है। फिर सभी चीजों को जोड़ने के बाद संग्रह को रीसेट करके यह सब प्रयास बर्बाद हो जाता है। –

2

NotifyCollectionChangedEventArgs सूचकांक जानकारी शामिल है। आइटम्स को हटाने से इंडेक्स को फिर से बदलना पड़ता है। इसलिए, पूरी तरह से असंभव नहीं होने पर, यह सीमाओं के साथ काम करने की क्षमता प्रदान करने के लिए बल्कि कठिन और संभवतः अक्षम होगा।

+0

एकमात्र सूचकांक जानकारी "वह सूचकांक जिस पर परिवर्तन हुआ"। यह जानकारी आसानी से रेंज ऑपरेशंस जोड़ने और निकालने के साथ प्रदान की जाती है। –

+0

@ A.R .: नहीं, क्या हुआ अगर मैं संग्रह का प्रथम और अंतिम आइटम निकालना चाहते हैं? घटना में केवल एक ही इंडेक्स है, लेकिन दो इंडेक्स आवश्यक हैं। –

+0

दो इंडेक्स हैं। 'न्यूस्टार्टिंग इंडेक्स' और 'ओल्डस्टार्टिंग इंडेक्स' है। उत्तरार्द्ध का वर्णन पढ़ता है "उस इंडेक्स को प्राप्त करता है जिस पर एक मूव, निकालें, या प्रतिस्थापन कार्रवाई हुई।", साथ ही, जब तक आप संग्रह में सभी आइटम को हटा नहीं रहे हैं, तब तक जो परिदृश्य आप वर्णन कर रहे हैं वह संभव नहीं है क्योंकि किसी श्रेणी में तत्व संगत हैं –

1

एक कारण है कि माइक्रोसॉफ्ट उन्हें

वे कार्यक्षमता के हर संभव टुकड़ा प्रदान नहीं करते हैं प्रदान नहीं किया होना चाहिए, यह (भी) बनाम मांग बात लागत।

आप अपनी खुद की संग्रह है कि थोक आपरेशनों का समर्थन करता है और INotifyCollectionChanged लागू करता है को लागू कर सकते हैं।

हां। और जब आप करते हैं, तो आप पाएंगे कि संग्रह को उन परिवर्तनों को प्रसारित करने के तरीके के बारे में विकल्प बनाना होगा। मैंने कभी कोशिश नहीं की लेकिन मुझे लगता है कि कुछ व्यापार-बंद हैं कि व्यू या व्यूमोडेल एक पुन: प्रयोज्य संग्रह के बारे में बेहतर निर्णय ले सकता है।

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