2009-06-04 5 views
18

एमवीवीएम पैटर्न के साथ एक WPF अनुप्रयोग बनाते समय, ऐसा लगता है कि मुझे आवश्यक टूल इकट्ठा करना होगा यहां तक ​​कि सबसे प्राथमिक घटना प्रबंधन शुरू करने के लिए, उदा।एमवीवीएम में घटनाओं और आदेशों को WPF/विजुअल स्टूडियो द्वारा असमर्थित क्यों किया जाता है?

  • AttachedBehaviors मैं here
  • DelegateCommands मैं से here

मिल अब मैं को किसी तरह की तलाश में हूँ कोई ComboBox में ItemSelected घटना को संभालने से मिलता है और चाल की हो रही सुझाव हूँ और यह करने के लिए वर्कअराउंड (XAML ट्रिगर का उपयोग करके या चयनित आइटम से जुड़े अन्य तत्व आदि)। ठीक है, मैं इस सड़क पर जा सकता हूं, लेकिन ऐसा लगता है कि पहिया को फिर से शुरू किया जा रहा है। यह अच्छा होगा कि आइटम से चुने गए कमांड को मैं अपने व्यूमोडेल में संभाल सकता हूं।

मैं मानक उपकरण के कुछ सेट गायब कर रहा हूँ या हर किसी WPF मूल रूप से निर्माण और एक साथ उपकरणों के लिए अपने स्वयं के संग्रह डाल सिर्फ इसलिए वे घटनाओं और आदेश, चीजें हैं जो केवल एक लेने के साथ सरल पाइपलाइन कार्य कर सकते हैं के साथ MVVM कर रही है एक क्लिक = "eventHandler" के साथ कोड-पीछे में जोड़े लाइनें?

+7

मुझे यह मानना ​​है कि डब्ल्यूपीएफ वास्तव में एमवीवीएम के लिए सुविधाओं का एक सेट याद करता है ... यह अच्छा होगा अगर माइक्रोसॉफ्ट किसी प्रकार का "आधिकारिक" एमवीवीएम टूलकिट प्रदान कर सके! –

उत्तर

7

जोश स्मिथ के article MVVM के बारे में के अनुसार, यह John Gossman's blog पर अक्टूबर 2005 में दुनिया के लिए पेश किया गया।

तब से मैं कहूंगा कि डब्ल्यूपीएफ/एमवीवीएम के लिए वास्तव में इसे लेने और समुदाय द्वारा स्वीकार किए जाने के लिए 2-3 साल लग गए, तब तक एमवीवीएम के साथ मुद्दों का समर्थन करने के लिए डब्ल्यूपीएफ को फिर से निकालने में बहुत देर हो गई। इसके अलावा मैं कहूंगा कि डब्ल्यूपीएफ ने एमवीवीएम बनाया है, इसलिए यह एमवीवीएम का समर्थन करने के लिए डब्ल्यूपीएफ परिवर्तन के पीछे पीछे लगता है।

अंत में, हर कोई WPF कर MVVM का उपयोग करता है, तो एपीआई घटनाओं आदि के मानक के उपयोग का समर्थन करने की जरूरत है

तो, आपके सवाल का जवाब देना, हाँ हर कोई वर्तमान में उपकरणों के लिए अपने स्वयं के सेट एक साथ के रूप में डाल दिया जाता है " आधिकारिक "समर्थन केवल इस समय DelegateCommands ढांचे प्रदान करता है।

+2

lol, मुझे इस विचार को "पैटर्न" के "अनावरण" के रूप में पसंद है जैसे कि यह उत्पाद – Schneider

+2

यह बहुत बुरा है माइक्रोसॉफ्ट स्पष्ट एमवीवीएम के लिए कुछ जारी नहीं करता है जैसे कि उन्होंने एएसपी.नेट एमवीसी के साथ किया था। – Kelly

0

विजुअलस्टूडियो के लिए इस एमवीवीएम प्रोजेक्ट टेम्पलेट पर नज़र डालें।

http://blogs.msdn.com/llobo/archive/2009/05/01/download-m-v-vm-project-template-toolkit.aspx

इस टेम्पलेट आप विभिन्न DelegateCommand वर्ग है जो ICommands के लिए अलग अलग की जरूरत को कवर मिलता है, और एक CommandReference वर्ग कि कुंजी बाइंडिंग के साथ मदद करता है के साथ

यह एक अच्छी शुरुआत है ...

+0

हां, जो मैंने ऊपर से डेलीगेट कॉमैंड्स से जुड़ा है, मैंने उस प्रोजेक्ट को लिया, कुछ बदल दिया और अटैचमेंटबैविर्स जोड़ा और इस एमवीवीएम टेम्पलेट के साथ आया http://tanguay.info/web/index.php?pg=codeExamples&id=195 जब मैं एमवीवीएम करता हूं तो मैं उपयोग करता हूं, लेकिन जब भी मैं कुछ सरल करना चाहता हूं तो यह अभी भी पर्याप्त नहीं है एक Combobox पर एक आइटम चयन घटना को संभाल लें। मैं इसे जोड़ना जारी रखूंगा क्योंकि मुझे एमवीवीएम उपकरण मिलते हैं लेकिन एमवीवीएम वीएस टेम्पलेट का विस्तार करने वाले इस तरह के संग्रह पर अन्य प्रयासों को ढूंढना अच्छा लगेगा। –

2

बीक्यूज़ एमवीवीएम डब्ल्यूपीएफ के बाद "आविष्कार" किया गया था ... इसलिए एमवीवीएम पहेली के बड़े टुकड़े डब्ल्यूपीएफ ढांचे का हिस्सा क्यों नहीं हैं।

न केवल यह कि एमवीवीएम को वास्तविक दुनिया में साबित/अभ्यास करने से पहले "पैटर्न" घोषित किया गया था। कौन सा पैटर्न इसके बारे में बिल्कुल विपरीत है - उन्हें के बाद कई अलग-अलग लोगों द्वारा सफल उपयोग के कई वर्षों के बाद देखा जाता है।

एक व्यक्ति पैटर्न के साथ आने वाला पैटर्न पैटर्न नहीं बनाता है।

+0

मैं और अधिक सहमत नहीं हो सका। पैटर्न बैंड वैगन पर होने की भीड़ है, और एक्सएएमएल के हिस्से के रूप में एमवीवीएम के मामले में मुझे विश्वास नहीं है। मुझे कुछ गंभीर उत्पादन ग्रेड कोड देखना होगा। –

+2

जब तक यह जॉन स्कीट नहीं है, और सवाल में पैटर्न बट-लात मारना है। एक व्यावहारिक प्रोग्रामर होने के लिए – Alan

16

आप आदेशों की जटिलता के बारे में सही हैं।मैं जितना संभव हो सके एम-वी-वीएम पैटर्न का पालन करने की कोशिश करता हूं, लेकिन मैं साधारण उपयोगकर्ता ईवेंट को संभालने के लिए परिष्कृत कामकाज को उचित नहीं ठहरा सकता हूं।

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

+6

+1। यदि आप पीछे कोड में इवेंट हैंडलिंग विधियों से कॉल अग्रेषित करते हैं, तो आपको फैंसी वर्कअराउंड की आवश्यकता के बिना चिंताओं को अलग कर दिया गया है। – dthrasher

+0

+1 वैध बिंदु - मैं घटनाओं को कमांड में बदलने के लिए किसी भी दिन किसी भी दिन अनावश्यक कोड लिखना पसंद करूंगा। –

+0

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

3

सुनकर खुशी हुई कि मैं केवल एकमात्र ऐसा नहीं हूं जो कमांडिंग कार्यान्वयन को सोचता है ओवरकिल है। डाटाबेसिंग स्वाभाविक रूप से अच्छी तरह से समर्थित है लेकिन मैं हफ्तों के लिए बटनों और तत्वों के अलावा अन्य चीजों के लिए कमांड बाइंडिंग को समझने की कोशिश कर रहा हूं।

इस प्रश्न को पोस्ट करने के लिए धन्यवाद। मुझे लगता है कि अब से मैं दृश्य मॉडल कार्यों में रीडायरेक्ट के साथ दृश्य परत में सभी घटनाओं को संभालने जा रहा हूं। मुझे लगता है कि इस तरह उन्होंने माइक्रोसॉफ्ट के एक्सएएमएलएफएस्ट 2-दिवसीय पाठ्यक्रम में से एक में मूल एमवीवीएम पढ़ाया। मेरे लिए काफी अच्छा!

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