2010-09-08 12 views
9

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

उत्तर

7

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

+0

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

3

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

इंटरफ़ेस का उपयोग करना अभी भी व्यू और व्यू मॉडेल को बड़े पैमाने पर डीकॉप्लेड रखता है और आपको परीक्षण के दौरान विशिष्ट IView को नकल करने में सक्षम बनाता है।

10

"शुद्ध" एमवीवीएम में, व्यूमोडेल को वास्तव में दृश्य का संदर्भ नहीं देना चाहिए। हालांकि, अक्सर दृश्य में कुछ प्रकार का इंटरफ़ेस प्रदान करने के लिए सुविधाजनक होता है जिससे ViewModel इसके साथ बातचीत कर सकता है।

हालांकि, मैंने पाया है कि मैं अब और अधिक नहीं करता हूं। वैकल्पिक दृष्टिकोण attached property के कुछ रूपों का उपयोग करना है या अपने दृश्य में मिश्रण व्यवहार करना है, और इसे अपने ViewModel गुणों से जोड़ना है। यह आपको दृश्य के भीतर दृश्य तर्क 100% रखने की अनुमति देता है। इसके अलावा, इसके लिए एक व्यवहार बनाकर, आप पुन: प्रयोज्य प्रकार बनाते हैं जिसका उपयोग प्रत्येक व्यू मॉडेल-> इंटरैक्शन देखें में इसे संभालने के लिए किया जा सकता है। मैं ViewModel के भीतर कोई व्यू तर्क रखने पर इस दृष्टिकोण को दृढ़ता से पसंद करता हूं।

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

0

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

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