दिलचस्प पोस्ट
बेहतर प्रदर्शन करने के लिए IOStream कैसे प्राप्त करें? सिसिरी.स्टैट्स में उपलब्ध सभी वितरण क्या दिखते हैं? पूर्ववत इंजन के लिए डिजाइन पैटर्न यूएस फोन नंबर को मान्य करने के लिए नियमित अभिव्यक्ति? कॉमा और बिंदु के साथ दोगुनी करने के लिए स्ट्रिंग पार्स करें कौन से ग्राफ़िक फ़ाइल स्वरूप ब्राउज़र द्वारा समर्थित हैं? मुझे जावास्क्रिप्ट प्रोटोकॉल निर्दिष्ट करने की आवश्यकता कब है? जावास्क्रिप्ट का उपयोग कर मैं एक लिंक कैसे बनाऊं? सी + + स्थिर वर्चुअल सदस्य? एंड्रॉइड में एसडीसीडी से एक विशिष्ट फाइल को पढ़ना ट्विटर बूटस्ट्रैप 3 – एक कस्टम ग्लिफ़िकॉन बनाएं और ग्लाइफिकॉन "फ़ॉन्ट" में जोड़ें सी # स्ट्रिंग से वर्ण निकालें अजगर खोल में मौजूदा निर्देशिका को कैसे जानना / बदलना है? सी में फाइल की सामग्री पाने का सबसे आसान तरीका मैं SQL सर्वर डाटाबेस में कहीं भी एक मान कैसे प्राप्त करूं?

क्यों WPF MVVM पैटर्न में codebehind से बचने के लिए?

लेख में, मॉडल-व्यू-देखें मॉडल डिजाइन पैटर्न के साथ WPF Apps , लेखक जोश स्मिथ ने कहा है:

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

मेरा प्रश्न (1) में है, खाली कोडबेहिन्ड को एवीए के रूप में माना जाता है क्योंकि एमवीवीएम अच्छी तरह डिज़ाइन किया गया है। (यह लगता है कि रिक्त codebehind हमेशा अच्छा होता है।)

संपादित करें: मेरा प्रश्न निम्न के रूप में है, क्यों AttachedCommandBehavior InvokeCommandAction या InvokeCommandAction तरह दृष्टिकोण को InvokeCommandAction कोडिंग से बचने का प्रयास किया गया है।

मुझे और अधिक विस्तार की व्याख्या करें।

जहां तक ​​(1) का संबंध है, मैं निम्नलिखित की तरह अटैचमेंट कॉमांडबैवियर से सोचता हूं। जैसा कि बॉर्डर ने MouseRightButtonDown के लिए MouseRightButtonDown लागू नहीं किया है, आप आमतौर पर ईवेंट और MouseRightButtonDown बाइंड नहीं कर सकते, लेकिन अटैचमेंट MouseRightButtonDown साथ क्या कर सकते हैं।

 <!-- I modified some code from the AttachedCommandBehavior to show more simply --> <Border> <local:CommandBehaviorCollection.Behaviors> <local:BehaviorBinding Event="MouseRightButtonDown" Command="{Binding SomeCommand}" CommandParameter="A Command on MouseRightButtonDown"/> </local:CommandBehaviorCollection.Behaviors> </Border> 

या

हम System.Windows.Interactivity.InvokeCommandAction साथ ऐसा कर सकते System.Windows.Interactivity.InvokeCommandActionSystem.Windows.Interactivity.InvokeCommandAction

 <Border xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" > <i:Interaction.Triggers> <i:EventTrigger EventName="MouseRightButtonDown"> <i:InvokeCommandAction Command="{Binding SomeCommand}" CommandParameter="A Command on MouseRightButtonDown"/> </i:EventTrigger> </i:Interaction.Triggers> </Border> 

परंतु,

हम निम्नलिखित XAML का उपयोग करते हैं और इसके Border_MouseRightButtonDown उपयोग Border_MouseRightButtonDown विधि है, जो कि (2) जोश Border_MouseRightButtonDown से जुड़ा हुआ है ऊपर से कहा गया है।

 <Border MouseRightButtonDown ="Border_MouseRightButtonDown"/> 

मुझे लगता है कि इसके बाद के संस्करण के कोडबेहिंड का इस्तेमाल करना बुरा नहीं है, क्योंकि इनके बीच का अंतर केवल एक कमांड बंधन या ईवेंट हैंडलर को जोड़ता है।

आप इस बारे में क्या सोचते हैं?

वेब के समाधान से एकत्रित समाधान "क्यों WPF MVVM पैटर्न में codebehind से बचने के लिए?"

क्यों खाली codebehind को एक अच्छी तरह से डिज़ाइन MVVM के रूप में माना जाता है

कोड-पीछे वाली फाइल करने के बाद, जिसमें अपने कॉलर के प्रारंभ में कॉल करने के लिए पूरी तरह से कॉल किया जाता है, इसका अर्थ है कि आपने शुद्धता प्राप्त की है – आपके पास कोडबेहिंड में बिल्कुल शून्य तर्क है। आपने अपने दृश्य को किसी भी कोड के साथ प्रदूषित नहीं किया है जो कि दृश्यमॉडल या मॉडल में ठीक से संबंधित है। इसका मतलब कुछ चीजें हैं:

  • अलगाव में परीक्षण करने के लिए व्यू मॉोडल (और मॉडल) आसान है
  • आपने ढीले युग्मन का एक अच्छा स्तर हासिल कर लिया है, जिसमें रखरखाव और विस्तार योग्यता के उत्कृष्ट लाभ हैं

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

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

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

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

यदि आप इस विशेष पद्धति से कैसे मदद करते हैं, का एक उत्कृष्ट उदाहरण चाहते हैं, तो एएसपी.Net में कुछ जरूरी जटिल स्क्रीन लिखने की कोशिश करें, और फिर इसे WPF या Silverlight में लिखें, और अंतर को नोट करें


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

मुझे आपके कुछ सवालों के जवाब दें, मुझे उम्मीद है कि यह मदद करता है ….

व्यू मॉोडेल (दृश्य का मॉडल) भूमिका, मेरे विचार में, UI तर्क और एक दृश्य की स्थिति है

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

और दृश्य की भूमिका कुछ सामग्रियां प्रदर्शित कर रहा है और व्यूमोडाल को सिंक्रनाइज़ कर रहा है (डाटाबेसिंग कोड)

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

कोड में पीछे कुछ भी बुरा नहीं है- पीछे सरल मामलों के लिए, इसे ठीक करना है हालांकि, कई परिदृश्यों में UI तर्क को प्रबंधित करना कठिन हो सकता है संलग्न व्यवहारों और दृश्य मॉडल में तर्क को संकुचित करना हमें चर को अलग करने की अनुमति देता है (और उन्हें परीक्षण) ताकि यह समझना और बनाए रखना आसान हो।

यदि testability एक चिंता का विषय है, तो आपके यूआई तर्क का अधिक है कि आप व्यू-मॉल्स और संलग्न व्यवहार में शामिल कर सकते हैं, जितना अधिक आप यूआई परीक्षण के बिना प्रयोग करने में सक्षम होंगे। (यद्यपि यह यूआई परीक्षण की पूरी आवश्यकता को समाप्त नहीं करता है, यह यूआई टेस्टिंग में संलग्न होने से पहले एक सत्यापन का पहला स्तर प्रदान करता है जो अधिक समय / संसाधन गहन होगा।

एमवीवीएम कोड और पृष्ठ डिजाइन पूरी तरह से विभाजित कर सकता है; कोडर सिर्फ कोडिंग के बारे में परवाह करते हैं और डिजाइनर केवल डिजाइन की परवाह करते हैं परंतु:

  1. मैंने कभी भी कोई डिजाइनर नहीं देखा है जो ब्लेंड या समझने वाले XAML का इस्तेमाल करता है।
  2. लगभग सभी एक्सएएमएल को कोडर खुद द्वारा लिखे गए हैं।

मुझे लगता है कि उद्धृत अनुभाग डेटा को देखने के तरीके के बारे में बताता है। मेरा मानना ​​है कि उनका मतलब है कि कोड को उस कोड के पीछे नहीं लिखना चाहिए, उदाहरण के लिए, कैसे डेटा प्रदर्शित किया जाता है (उदाहरण के लिए कुछ ऐसा: label1.Text = ... )। बाइंडिंग का उपयोग करने से ऐसी बातें करने से डिजाइन और कोड को अलग करना आसान हो जाता है (क्या होता है यदि आपको बाद के संस्करण में "टीबीटीस्ट" नामक पाठ बॉक्स में डेटा प्रदर्शित करने की आवश्यकता है तो आपको क्या करना होगा? आपको अपना कोड पीछे करना होगा)

वे यह नहीं कह रहे हैं कि आपको कोड के पीछे कोई कोड नहीं होना चाहिए – वे सिर्फ यह कह रहे हैं कि एक आदर्श दुनिया में, आप केवल घटनाओं या प्रक्रिया डेटा पर प्रतिक्रिया करेंगे जो अन्यथा संसाधित नहीं हो पाए।

कम से कम यह है कि मैं आपके द्वारा उद्धृत अनुभाग से क्या समझता हूं