MVVM में, नए विचार बनाने के लिए ViewModel या View को जिम्मेदार होना चाहिए?


11

अपने WPF एप्लिकेशन में, मैं एक नया दृश्य बनाना चाहता हूं। मुझे यह कहां करना चाहिए - ViewModel या मॉडल में ?

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

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

दूसरी ओर, ViewModel में एक नया दृश्य बनाने से सिद्धांत का उल्लंघन होता है कि ViewModel को View के बारे में कुछ भी पता नहीं होना चाहिए।

तो, क्या व्यू या व्यूमॉडल में नए विचार बनाना बेहतर है?


1
मैं वास्तव में आपके प्रश्न को नहीं समझता। "इन व्यू या व्यूमॉडल" का क्या अर्थ है? ViewModels दृश्य नहीं बनाते हैं, और दृश्य निश्चित रूप से खुद को नहीं बनाते हैं।
रॉबर्ट हार्वे

1
मेरा मतलब है कि नए विचार बनाने के लिए इनमें से कौन सी परत जिम्मेदार होनी चाहिए - ऐसा करने के लिए संकेत जब कार्रवाई होती है तो कहीं से आना चाहिए। मैंने इस प्रश्न से पूरी तरह से मॉडल को बाहर रखा, क्योंकि यह दृश्यपटल के बारे में कुछ भी नहीं जानना चाहिए।
मैक 70

शायद मैं आपके सवाल को सही तरह से नहीं समझ पा रहा हूँ, दोनों को आपके विचार में हस्तक्षेप नहीं करना चाहिए। यदि आप अपने viewModel में एक नया दृश्य बनाना चाहते हैं, तो क्या ऐसा कोई कारण है कि आप xaml में फ़्रेम का उपयोग विंडो सामग्री को अपने वर्तमान दृश्यमॉडल के लिए बाइंडिंग के साथ बदलने के लिए नहीं कर रहे हैं?
सियोभान

जवाबों:


8

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

A ProductViewModel(उदाहरण के लिए) अपने आप this.viewFactory.Show("Details", this)से खुलने का आह्वान ProductDetailsViewकरता है ProductViewModel। यह किसी अन्य दृश्य मॉडल के आधार पर एक दृश्य भी खोल सकता है this.viewFactory.Show<ClientViewModel>()

कार्यान्वयन (वास्तव में WinForms के लिए कई हैं, साधारण Wpf विंडोज, टैब के साथ एक Wpf शेल ...) एक StructureMapसम्मेलन पर आधारित है । दृश्य एक IView<ProductViewModel>इंटरफ़ेस के माध्यम से अपने दृश्य मॉडल को नामित करते हैं ।

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


7

सैद्धांतिक उत्तर

यदि आपके पास एक ViewModelक्रिया है, जिसमें कॉस्मेटिक प्रभाव हैं (जैसे माउसओवर पर एक आइटम हाइलाइट करें) का काम है View, जबकि "वास्तविक" प्रभाव (उदाहरण के लिए एक नई विंडो को खोलना) वाले कार्य हैं ViewModel

जैसे, एक नई विंडो बनाना एक काम है ViewModel। हालाँकि, न तो दृश्य और न ही ViewModelपता होना चाहिए कि विंडो कैसे बनाई जाए, यह उनकी ज़िम्मेदारियों का हिस्सा नहीं है और एक अलग वर्ग का है।

आप तर्क दे सकते हैं कि एक नई विंडो बनाना एक काम है View। हालांकि मैं असहमत हूं, लेकिन इस तरह की बहस में बहुत कम मूल्य है, क्योंकि व्यवहार में यह दुनिया का अंत नहीं है यदि आप उस कोड को जगह देते हैं View, और यह ViewModelबाद के बिंदु पर इसे स्थानांतरित करने के लिए बहुत काम नहीं है। । महत्वपूर्ण हिस्सा यह है कि एक नई विंडो के निर्माण के लिए तर्क एक स्वतंत्र वर्ग में निहित है, आमतौर पर किसी प्रकार का WindowFactory। MVVM, MVP, MVC, आदि की बात यह है कि आपके पास कुछ और अच्छी तरह से परिभाषित जिम्मेदारियों के साथ कक्षाएं हैं। यही कारण है कि आप के लिए अतिरिक्त जिम्मेदारी नहीं जोड़ते है View, ViewModelया Modelअगर आप की जरूरत नहीं है।

किसी भी परिस्थिति में विंडो का निर्माण नहीं होता है Model, क्योंकि Modelयह भी पता नहीं है कि कोई GUI जैसा कुछ है।

व्यावहारिक उत्तर

यह "सिंगल-विंडो फॉर्म-लाइक टूल" है, जिसमें सिंगल "सेंड" बटन है । तो यहाँ मेरा संबंधित जवाब के लिए एक बेशर्म प्लग है: MVVM का उपयोग क्यों करें?

सारांशित करने के लिए कि उत्तर क्या कहता है: इसे सरल रखें। ओह, और अपने सिंगल बटन विंडो को और अधिक जटिल होने के बाद लागू करने के लिए सैद्धांतिक उत्तर को ध्यान में रखें।

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