2013-05-02 5 views
5

मैं सी #, डब्ल्यूपीएफ और एमवीवीएम पैटर्न में नया हूं। इस काफी लंबी पोस्ट के लिए खेद है, मैं समझने के अपने सभी बिंदुओं (या समझ में नहीं) सेट करने की कोशिश कर रहा हूं।कमांड और एमवीवीएम सिद्धांत - रिलेकॉमैंड्स

WPF और MVVM पैटर्न द्वारा प्रदान की गई कमांडिंग तंत्र पर बहुत से ग्रंथों का अध्ययन करने के बाद, मुझे इन चीजों का उपयोग करने के तरीके पर सीधे मेरे दिमाग में कुछ समस्याएं आ रही हैं।

मैं समझता हूं कि WPF के लिए दिए गए आदेश दृश्य वृक्ष के घटक में आयोजित कमांड तर्क के लिए एकाधिक "कॉलिंग पॉइंट" को परिभाषित करने की अनुमति देता है। जब एक कमांड कहा जाता है, तो कॉल दृश्य वृक्ष (कमांड लक्ष्य या केंद्रित तत्व से शुरू होता है) के माध्यम से कॉल करता है जब तक कि यह कमांडबिंग वाले तत्व में बाधा न हो जो कमांड तर्क कहां परिभाषित करता है।

इसके बारे में क्या अच्छा लगता है कि आप तर्क को निर्दिष्ट किए बिना सार्वजनिक आदेशों को परिभाषित कर सकते हैं और न ही कॉलिंग पॉइंट्स को पहले निर्दिष्ट कर सकते हैं।

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

मैंने पाया कि जोश स्मिथ के रिले कॉमांड जैसे कस्टम कार्यान्वयन का उपयोग इस मामले में किया जा सकता है, क्योंकि आप अंतर्निहित व्यूमोडेल में रिलेकॉमांड ऑब्जेक्ट को दृश्य के एक तत्व (उदाहरण के लिए बटन) द्वारा बुलाए गए कमांड को बाध्य करते हैं।

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

कोई मुझे बता सकता है कि मैं गलत कहां हूं? (उन लोगों के लिए धन्यवाद जो अंत में पोस्ट पढ़ते हैं!)

सम्मान। एनआर

उत्तर

4

लेकिन फिर भी, मैं देख रहा हूँ कि यह कैसे (WPF कमांडिंग पैटर्न की परिभाषा के द्वारा) एक आदेश है अब के बाद से हम सीधे एक कार्यान्वयन कि ViewModel में संदर्भित है निर्दिष्ट कर रहे हैं नहीं है।

यह अभी भी एक आदेश है, और ICommand लागू करता है, लेकिन अब यह WPF में निर्मित रूटिंग रणनीतियों का लाभ नहीं ले रहा है। यह एक आदेश है, लेकिन अब RoutedCommand नहीं है - इसलिए एक अर्थ में, आप सही हैं - यह डब्ल्यूपीएफ के रूटेड कमांडिंग इंफ्रास्ट्रक्चर की मूल अवधारणाओं का पालन नहीं कर रहा है, लेकिन यह अभी भी एक कमांड है।

इस विधि के साथ, हम यह जानने के बिना कहीं भी एक कमांड कॉल करने में सक्षम होने के सभी लाभ खोले हैं कि तर्क कहां लागू किया गया है। इस मामले में, सीधे क्लिक ईवेंट हैंडलर का उपयोग क्यों न करें (उदाहरण के लिए)?

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

ईवेंट हैंडलर पर वापस स्विच करना यह तोड़ता है - यदि आप ईवेंट हैंडलर का उपयोग करते हैं, तो दृश्य के कार्यान्वयन को बदलने के लिए ईवेंट हैंडलर (कोड पीछे) अपडेट करना आवश्यक है।

+0

शानदार उत्तर। मैं भी डब्ल्यूपीएफ सीखने के बीच में हूं और मुझे यह काफी मुश्किल लगता है। क्या आप इस बात पर टिप्पणी कर सकते हैं कि कोई अन्य विधि से बुलाए गए कमांड में निहित तर्क का उपयोग कैसे कर सकता है? मुझे लगता है कि इस मामले में आप उचित तर्क के साथ एक विधि लिखेंगे और इसे कमांड से भी कॉल करेंगे? आपके समय के लिए धन्यवाद। – MoonKnight

+2

@ किलरकैम सामान्य रूप से, प्रत्येक "विधि" जिसे आप कॉल करना चाहते हैं, एक एकल 'आईसीओएमएंड' के भीतर encapsulated हो जाता है - आप एक 'आईसीओएमएंड' हो सकता है जो सिर्फ कई तरीकों को लिखता है, हालांकि (बस एक तरीका है जो कॉल> 1 विधि है)। –

+0

आपके समय के लिए बहुत बहुत धन्यवाद। – MoonKnight

0

एमवीवीएम प्रोजेक्ट में मूल WPF कमांड व्यवहार का उपयोग करने के तरीके के बारे में कुछ और शोध के बाद, मुझे यह लिंक मिला: http://matthamilton.net/commandbindings-with-mvvm!

जो मैं समझता हूं उससे, यह व्यूमोडेल द्वारा संचालित कमांडबिंडिंग को देखने के लिए "संलग्न" करने का एक तरीका प्रदान करता है। इस तरह, व्यूमोडेल एक कमांडबाइंडिंग को कार्यान्वित करने में सक्षम होगा जिसे खोजा जाएगा जब कमांड कॉल दृश्य पेड़ पर चलता है।

अलविदा।

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