क्या मुझे ICollectionView या ObservableCollection को बांधना चाहिए


83

चाहिए एक बाँध DataGridके लिए

ICollectionView = CollectionViewSource.GetDefaultView(collection)

या करने के लिए

ObservableCollection<T> collection; ???

MVVM के लिए सबसे अच्छा अभ्यास क्या है और क्यों?

जवाबों:


129

आप हमेशा एक को बांधते हैं ICollectionView, चाहे आप इसे स्पष्ट करें या नहीं।

माना कि हमारे पास है

var collection = new ObservableCollection<string>();
var collectionView = CollectionViewSource.GetDefaultView(collection);

इस मामले में, के लिए बाध्य collectionया करने के लिए collectionViewएक और एक ही है: बाध्यकारी इंजन डिफ़ॉल्ट संग्रह देखने के लिए बाध्य होगा (जो संदर्भ है के बराबर collectionView) यदि आप करने के लिए बाध्य करने के लिए कह collection

इसका मतलब है कि आपके प्रश्न का उत्तर "यह बिल्कुल कोई फर्क नहीं पड़ता है"।

बस पूरी तरह से स्पष्ट होने के लिए: यहां तक ​​कि अगर आप सीधे संग्रह में बांधते हैं, तो बाइंडिंग इंजन डिफ़ॉल्ट दृश्य से बंध जाएगा। दृश्य के संशोधित गुण जैसे कि सॉर्ट मानदंड उस बाइंडिंग को प्रभावित करते हैं जो सीधे संग्रह में बाँधने के लिए प्रकट होती है, क्योंकि कवर के पीछे यह डिफ़ॉल्ट दृश्य के लिए एक बाध्यकारी है।

हालांकि, एक और दिलचस्प और संबंधित सवाल है: क्या एक व्यक्ति को डिफ़ॉल्ट संग्रह दृश्य (यानी, स्वयं संग्रह करने के लिए बाध्य करना चाहिए, क्योंकि स्पष्ट रूप से डिफ़ॉल्ट दृश्य से बाइंड करने का कोई कारण नहीं है) या उसी संग्रह के किसी अन्य दृश्य के लिए?

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


1
बहुत बढ़िया जवाब। मेरी स्वयं की प्राथमिकता अब ऑब्जर्वेबल कॉलेक्शन के लिए बाध्य है कि यह System.Collections का हिस्सा है और "कुछ ऐसा महसूस करता है" जो मैं व्यू के विपरीत मॉडल के बारे में प्रतिनिधित्व कर रहा हूं, उसके बारे में अधिक प्रतिनिधि है, लेकिन MVVM इस तरह से कभी-कभी स्पर्शी है
बेरील

ग्रेटे उत्तर। मैं केवल यह बताना चाहूंगा कि सिल्वरलाइट में एक डिफ़ॉल्ट संग्रह दृश्य बाध्य संग्रह के लिए नहीं बनाया जाएगा जब तक कि बाध्य संग्रह ICollectionViewFactory नहीं लागू होता है।
jspaey

क्या यह भी / अभी भी यूनिवर्सल ऐप्स पर लागू है?
राबर्ट मैकलेन

@RobertMacLean: मेरे पास कोई WP विकास का अनुभव नहीं है इसलिए दुर्भाग्य से कोई विचार नहीं है।
जॉन

Xaml में अंतर्निहित संग्रह के लिए एक स्पष्ट दृश्य बनाने के लिए, संसाधन में एक संग्रह दृश्य स्रोत बनाएँ। अंतर्निहित संग्रह के लिए CollectionViewSource.Source संपत्ति बांड होने। फिर StaticResource के माध्यम से संसाधन में आपके द्वारा बनाए गए CollectionViewSource के लिए अपने ItemControl.Itemource संपत्ति को बाइंड करें। इस तरह, एक दृश्य पर लागू किए गए सॉर्टिंग / फ़िल्टर / ग्रुपिंग ऑपरेशन किसी अन्य आइटम को "दूषित" नहीं करेगा जो कि डिफ़ॉल्ट संग्रह दृश्य के लिए बाध्यकारी हैं।
फ्रैंक लियू

35

ObservableCollection<T>INotifyCollectionChangedजब संग्रह में आइटम बदले गए हैं, तो UI लागू करेगा और उसे सूचित करेगा।

ICollectionViewINotifyCollectionChangedयदि आप अंतर्निहित घटनाओं को लागू करते हैं, तो घटनाओं को प्रचारित करने के अलावा संग्रह को फ़िल्टर, सॉर्ट या समूह करने की क्षमता देंगे ।

जब तक आप इसे बांधते हैं, तब तक MVVM के साथ या तो प्रकार अच्छा काम करता है। ICollectionViewजब आपको छांटने, छानने या समूह बनाने की आवश्यकता हो तब उपयोग करें । ObservableCollection<T>जब आप सीधे उपयोग न करें।


यह अन्य पोस्ट विरोधाभास लगता है कि ICollectionView स्वचालित रूप से एक संग्रहित घटना के आधार पर अपडेट हो जाएगा ... क्या यह गलत है? stackoverflow.com/a/17906474/3195477
UuDdLrLrSs

@UuDdLrLrSs यदि संग्रह में आइटम संशोधित किए गए हैं, तो UI जो उन वस्तुओं या उन वस्तुओं के गुणों से बंधा है, संग्रह पर ताज़ा करने की आवश्यकता के बिना अपडेट होंगे। अन्य पोस्ट विशेष रूप से संग्रह में वस्तुओं के गुणों को बदलने के बारे में पूछ रही है और स्वचालित रूप से ICollectionView के एक ताज़ा को ट्रिगर करता है ताकि यह सुनिश्चित हो सके कि इसमें वे आइटम शामिल हैं जो अभी भी फ़िल्टर मानदंडों से मेल खाते हैं। अन्य पोस्ट में उत्तर के आधार पर, आपको संग्रह में वस्तुओं की "सूची" को अपडेट करने के लिए रिफ्रेश () विधि को कॉल करना होगा।
जिम्मी आर। होट्स

9

जॉन ने जो कहा, उसे जोड़ने के लिए। मुख्य अंतर यह है कि, उपयोग करके CollectionViewSource.GetDefaultView(collection), आप आपको WPF पर निर्भर ViewModel बना रहे हैं। कई MVVM शुद्धतावादियों को यह पसंद नहीं है और यह ऑब्जर्वेबल कॉलेक्शन को केवल वैध विकल्प छोड़ देगा।

अन्य विकल्प ICollectionViewएक वर्ग का उपयोग और उपयोग करना होगा , जो इसे लागू करेगा, लेकिन स्वयं WPF का हिस्सा नहीं है।


1
हालांकि यह मुख्य अंतर नहीं है। Wpf टैग नोट करें। "यदि []] बाउंड कंट्रोल के लिए वर्तमान आइटम, फिल्टर और कंपनी की अलग-अलग धारणाओं की आवश्यकता है, तो आप जो चाहते हैं, वही अंतर्निहित संग्रह के कई विचारों को स्पष्ट रूप से बांधना है"। यही अंतर है। एक "शुद्धतावादी" होने के नाते, जो कुछ भी है, इसका मतलब है कि आप फ़िल्टर नहीं कर सकते हैं आदि। जिमी हाउट्स का उत्तर देखें जो स्पष्ट भाषा में वास्तविक अंतर पर केंद्रित है।
डिर्क बेस्टर

7

मुझे नहीं लगता कि इसमें कुछ भी करना MVVMहै। ICollectionViewsoring समूहीकरण और आदि की तरह अतिरिक्त सुविधाओं को प्रदान करता है कि आप उन उपयोग की जरूरत है IColectionViewअन्यथा बस का उपयोगObservableCollection


2

यदि आप अपने ग्रिड को देखने के लिए लागू की गई सेटिंग्स को प्रदर्शित करना चाहते हैं, जैसे फ़िल्टर करना, तो आप दृश्य से बाध्य होंगे, अन्यथा दृश्य निरर्थक है।

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