2009-10-16 11 views
10

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

हम एक एमवीवीएम संरचना का उपयोग कर रहे हैं।

मेरा प्रश्न है, किसकी जिम्मेदारी सूची को फ़िल्टर करना है? दृश्य या दृश्यमान? क्या मुझे xaml.cs में "ऑनटेक्स्ट चेंज" ईवेंट लागू करना चाहिए, या मुझे ViewModel में एक संपत्ति का उपयोग करना चाहिए और सूची फ़िल्टर करने के लिए PropertyChanged का उपयोग करना चाहिए।
फॉलो-अप प्रश्न है, क्या मुझे व्यूमोडेल में बाइंडिंगलिस्ट/ऑब्जर्जेबल कोलेक्शन का उपयोग करना चाहिए, या आइटम्स कंट्रोल को बाध्य करने के लिए आईसीओलेक्शन व्यू का उपयोग करना चाहिए?

मैंने दोनों विधियों की कोशिश की, और वे दोनों काम करते हैं। ViewModel को देकर जिम्मेदारी को खाली दृश्य से पीछे रखता है, लेकिन दूसरी तरफ मैं पूरी तरह से आश्वस्त नहीं हूं कि यह फ़िल्टरिंग लागू करने के लिए व्यूमोडल्स की ज़िम्मेदारी है (उदाहरण के लिए: अलग-अलग विचारों को अलग-अलग फ़िल्टरिंग की आवश्यकता हो सकती है)

कोई विचार ?

धन्यवाद, रोएल

संपादित करें:

कि क्या मुझे ViewModel में डालने के बारे में परेशान है (मेरे वर्तमान कार्यान्वयन में) वहाँ एक संदर्भ System.Windows.Data है। यह एक संदर्भ है जो मुझे व्यूमोडेल में नहीं है क्योंकि यह स्पष्ट रूप से कुछ संबंधित है। या क्या मैं कुछ न कुछ भूल रहा हूं? प्रासंगिक कोड:

ICollectionView customerView = CollectionViewSource.GetDefaultView(customers); 
+0

यह एक अच्छा सवाल है, खासकर व्यूमोडेल के बारे में 'System.Windows.Data' के संदर्भ की आवश्यकता है। – pauldoo

उत्तर

6

व्यूमोडेल, बिना किसी संदेह के। कोड-पीछे से बचें पैटर्न का अंतिम लक्ष्य है - असल में, व्यूमोडेल स्वयं कोड के पीछे कोड है।

जैसे: अलग-अलग दृश्यों अलग छानने की आवश्यकता हो सकती

विभिन्न विचारों अलग ViewModels होना चाहिए। ViewModel मूल रूप से एक कोड (पीछे कुछ और) कोड-पीछे फ़ाइलों के लिए ऑब्जेक्ट उन्मुख दृष्टिकोण है।

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

3

मुझे लगता है कि इस प्रकार की फ़िल्टरिंग कार्यक्षमता व्यूमोडेल में है। याद रखें, आप व्यूमोडेल में जितना संभव हो उतना टेस्टेबल कोड रखना चाहते हैं (जिसे आप यूनिट-टेस्ट करेंगे, है ना?)। इसके विपरीत, आप दृश्य दुबला और मतलब रखना चाहते हैं।

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

1

कोई सही तकनीकी उत्तर नहीं है। पैटर्न का उद्देश्य कार्यक्षमता और सौंदर्यशास्त्र की चिंताओं को विभाजित करना है, इस आधार पर कि एक कलात्मक डिजाइनर व्यक्ति समझ में नहीं आता है कि कार्यक्षमता को कैसे कार्यान्वित किया जाए, और यूआई परीक्षण करना मुश्किल है।

लेकिन यदि आप फ़िल्टरिंग को कुछ सरल, उदाहरण के लिए पैरामीटर कर सकते हैं। "क्षेत्र" नामक एक टेक्स्ट प्रॉपर्टी जिसे "यूरोप", "उत्तरी अमेरिका", "एसा" आदि पर सेट किया जा सकता है, जो समझने में काफी आसान है, और स्वतंत्र रूप से परीक्षण योग्य है। यह आपको दृष्टि में कार्यक्षमता (बहुत सीमित अर्थ में) पर नियंत्रण का एक छोटा सा नियंत्रण देता है। यदि आपके प्रयासों के लिए कुछ मूल्य है, तो इसे करें। अगर ऐसा नहीं होता है, तो मत करो।

और आखिरकार, यदि इस पैटर्न को लागू करने का प्रयास करने से आप उत्पादकता के महंगे पर दार्शनिक भेदभाव के बारे में सोच सकते हैं और आश्चर्यचकित हो सकते हैं, तो यह आपकी मदद नहीं कर रहा है।

4

आप मेरे ब्लॉग पर this article देख सकते हैं जहां मैं वस्तुओं का संग्रह फ़िल्टर करने के लिए एमवीवीएम पद्धति का उपयोग करता हूं। मुझे लगता है कि यह निश्चित रूप से वीएम वर्ग की ज़िम्मेदारी है।

0

मैं आपसे सहमत हूं कि यह परेशान है कि VieModel में प्रौद्योगिकी रिसाव देखें। इसी तरह से, मैं अपने ViewModels में RelayCommand ऑब्जेक्ट का उपयोग करता हूं जो System.Windows.Input का उपयोग कर रहा है।

यहां पोस्ट किए गए सभी कारणों के लिए, मुझे लगता है कि व्यूमोडेल इस माध्यम (डब्ल्यूपीएफ/चांदी की रोशनी) के लिए सही डिजाइन विकल्प है, भले ही यह सही से कम हो।

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