2010-08-16 9 views
15

मैं एक आम नियंत्रण है कि मैं अपने पृष्ठों पर पुन: उपयोग करने में सक्षम हो जाएगा बनाने देख रहा था: एक AddressControl जो पता 1, पता 2, शहर, राज्य, ज़िप, आदि है ...डब्ल्यूपीएफ सर्वोत्तम व्यवहार: क्या कस्टम नियंत्रण एमवीवीएम डिज़ाइन के साथ अच्छी तरह से काम करते हैं?

मूल रूप से मैं सिर्फ एक श्रेणी का निर्माण (AddressEntity) जिसमें इन सभी वस्तुओं को शामिल किया गया था और INotifyPropertyChanged लागू किया गया था। मैंने उस कोड को मेरे कोड में डिस्पेंडेंसी प्रॉपर्टी के रूप में एड्रेस कंट्रोल के लिए शामिल किया और इसे अपनी गुणों के लिए बाइंडिंग के लिए डेटाकॉन्टेक्स्ट के रूप में उपयोग किया।

फिर, किसी ने कहा कि मेरा कोड बदसूरत था और मुझे एमवीवीएम देखना चाहिए। यह को देखते हुए, मुझे लगता है कि:

  • AddressEntity.cs सिर्फ डेटा (यानी पता 1, पता 2, आदि) और सदस्य (यानी क्लोन, ToString, आदि)
  • मैं कुछ की जरूरत है की एक कंटेनर हो जाएगा पताViewModel मेरी पता एंटीटी को लपेटने और प्रॉपर्टी नोटिफिकेशन चेंज, वैलिडेशन इत्यादि प्रदान करने के लिए
  • मुझे इसके लिए किसी "दृश्य" की आवश्यकता है।

समस्या यह है कि मैंने जो भी उदाहरण देखा है, वह एक उपयोगकर्ता नियंत्रण है जो कस्टम कंट्रोल नहीं है। इससे पहले कि मैं इस में बहुत गहराई से डील करता हूं ...

  • क्या इस उदाहरण के लिए एमवीवीएम + कस्टम कंट्रोल का उपयोग करना संभव है?
  • क्या यह उपयोगकर्ता कंट्रोल बनाम कस्टमकंट्रोल के प्राथमिक अंतरों के अपवाद के साथ दृश्य के रूप में एक ही चीज़ (UserControl बनाम कस्टमकंट्रोल) है? असल में, क्या मेरा कस्टम कंट्रोल वास्तव में सिर्फ एक दृश्य है?

संदर्भ: The Model-View-ViewModel (MVVM) Design Pattern for WPF

+0

देखें नीचे दो जवाब एक-दूसरे के विपरीत होने लगते हैं। मैं अब उलझन में हूं ... खासकर जब से दूसरा जवाब अधिक संभावना लगता है, लेकिन पहले जवाब में (अब तक 3 वोट) हैं। –

+0

मैं एनवीएम से सहमत हूं। मैंने व्यक्तिगत रूप से महसूस किया है कि कस्टम नियंत्रण और एमवीवीएम एक साथ अच्छी तरह से नहीं जा सकता है। आपके पास एक ही प्रोजेक्ट में सीसी और यूसी है लेकिन मैं अपने सीसीएवरस के लिए वीएम रखने के बारे में नहीं सोच सकता क्योंकि यूसी के लिए वीएम समझ में आता है। – akjoshi

+1

@akjoshi मुझे नहीं पता कि क्यों शुद्ध WPF और MVVM का एक-दूसरे के साथ कुछ लेना देना है। वास्तव में कोई फर्क नहीं पड़ता कि कस्टम या उपयोगकर्ता नियंत्रण आपको एमवीवीएम का उपयोग करने की आवश्यकता नहीं है और मैं यह भी कहूंगा कि उपयोगकर्ता या कस्टम नियंत्रण बनाते समय आपको एमवीवीएम का उपयोग नहीं करना चाहिए। लेकिन इन नियंत्रणों का उपयोग करके हाँ, एमवीवीएम उनका उपयोग करने का एक अच्छा तरीका है। मुझे लगता है कि "अब मैं व्यवसाय तर्क बना देता हूं और एमवीवीएम का उपयोग करता हूं" और "अब मैं नियंत्रण बनाता हूं और एमवीवीएम के बारे में कभी नहीं सुना" के बीच अंतर करना आसान है। उदाहरण के लिए, हमने नोड्स कनेक्शन आदि के साथ एक पूर्ण ग्राफ नियंत्रण बनाया है जो सभी कस्टम नियंत्रण हैं, लेकिन इस नियंत्रण का उपयोग ज्यादातर व्यूमोडल्स के माध्यम से किया जाता है। – dowhilefor

उत्तर

18

CustomControls MVVM के साथ कभी नहीं किया जाता है।

आप जो चाहते हैं वह आपके डेटा का एक पुन: प्रयोज्य दृश्य (उपयोगकर्ता नियंत्रण) है और नियंत्रण (कस्टम नियंत्रण) नहीं है।

उपयोगकर्ता नियंत्रण और कस्टमकंट्रोल दो पूरी तरह से अलग जानवर हैं।

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

होते हुए भी क्यों UserControls मूल रूप से विकसित किए गए, MVVM में आम तौर पर आप एक UserControl का उपयोग जब आप एक reuseable दृश्य जो अपने मॉडल/viewmodel के लिए विशिष्ट है चाहता हूँ। इसके बिना किसी भी कोड के एक्सएमएल (ऑटो जनरेटेड प्रारंभिक कॉम्पोनेंट सामान को छोड़कर)। आम तौर पर आप एक ही परियोजना है कि आप में उपयोग में एक UserControl रहते हैं।

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

WallStreetProgrammer की वजह से सम्मान के साथ, एक उपयोगकर्ता नियंत्रण और एक कस्टम नियंत्रण के बीच चुनने आप एक लापरवाही नियंत्रण थोड़ा बेवकूफ चाहते हैं।

+0

दुर्भाग्यवश उपयोगकर्ता बनाम कस्टम नियंत्रणों की बात आती है तो कुछ अतिरिक्त चिंताएं होती हैं। उदाहरण के लिए, यदि संसाधन गलत है, तो संसाधनों का प्रबंधन, उपयोगकर्ता नियंत्रण को बहुत बेकार प्रदान कर सकता है। लेकिन मैं सहमत हूं, उपयोगकर्ता या कस्टम नियंत्रण का चयन स्टाइल की कमी से नहीं किया जाना चाहिए। – dowhilefor

+0

यदि संसाधन शब्दकोशों को सही ढंग से संभाला नहीं जाता है तो आप पूरे एप्लिकेशन को बेकार भी प्रदान कर सकते हैं: पी। लेकिन सवाल के साथ क्या करना है? – NVM

+0

बेशक आप सही हैं, लेकिन उपयोगकर्ता नियंत्रण xml में एक MergedDictionary का उपयोग करना आपके xaml पर एक MergedDictionary का उपयोग करने से कहीं अधिक खराब है, जहां आपकी शैली आपके कस्टम नियंत्रण (या आपके जेनेरिक.एक्सएएमएल) के लिए संग्रहीत है। मैंने सीखा कि कठोर परिश्रम। ईमानदार होने के लिए, मुझे उपयोगकर्ता नियंत्रणों का उपयोग करने का कोई भी बिंदु नहीं दिखता है, लेकिन यह सिर्फ मेरे व्यक्तिगत विकल्प है। – dowhilefor

3

एमवीवीएम का उपयोग करते समय मॉडल और व्यूमोडेल दृश्य पर निर्भर नहीं होना चाहिए, इस बात पर उन्हें ध्यान नहीं देना चाहिए कि किस तरह का दृश्य उनका उपयोग करता है।

कस्टम नियंत्रण और WPF में उपयोगकर्ता नियंत्रण के बीच का अंतर यह है कि कस्टम नियंत्रण लुक नहीं है और इसे इसके ControlTemplate के माध्यम से अनुकूलित किया जा सकता है। यदि आप माइक्रोसॉफ्ट की तरह एक जेनेरिक कंट्रोल लाइब्रेरी लिख रहे हैं तो आपको यही लिखना चाहिए। यदि आपके पास नियंत्रण के लिए दिमाग में एक विशिष्ट रूप है, तो बस उपयोगकर्ता नियंत्रण के साथ जाएं, यह बहुत तेज है लेकिन केवल एक ही रूप होगी, जिसे आप इसके लिए परिभाषित करेंगे।

एमवीवीएम प्रोजेक्ट में कस्टम नियंत्रण और उपयोगकर्ता नियंत्रण के मिश्रण का उपयोग करना आम बात है। उदाहरण के लिए आप शायद माइक्रोसॉफ्ट (जैसे टेक्स्टबॉक्स और टेक्स्टब्लॉक) से कस्टम नियंत्रण का एक समूह का उपयोग करेंगे और उन्हें उपयोगकर्ता नियंत्रण में जोड़ देंगे।

Control Authoring Overview

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