/ / एमवीवीएम में WPF कमांडिंग के लिए स्वीकृत पैटर्न क्या है? - wpf, mvvm, कमांड, कमांड-पैटर्न

एमवीवीएम में डब्ल्यूपीएफ कमांडिंग के लिए स्वीकार्य पैटर्न क्या है? - wpf, mvvm, कमांड, कमांड-पैटर्न

मैं एक WPF ऐप पर काम कर रहा हूं और मैं समझता हूंकमांड पैटर्न बहुत अच्छा है, लेकिन मैंने पाया है कि एमवीवीएम के लिए कमांड पैटर्न के कई अलग-अलग कार्यान्वयन हैं। उनके WPF नमूना ऐप में "जोश स्मिथ" का कार्यान्वयन है। DelegateCommand प्रिज्म से, और द CommandBindings कार्यान्वयन।

मेरा सवाल यह है कि एमवीवीएम के साथ कमांड का उपयोग करने के लिए आम तौर पर स्वीकृत सर्वोत्तम अभ्यास क्या है? मेरा आवेदन प्रिज्म का उपयोग करता है DelegateCommand हमारे लिए उपलब्ध है।

मेरी टीम के देवता इस बारे में बहस कर रहे हैं कि कौन सा दृष्टिकोण "सर्वश्रेष्ठ" है। कुछ "प्रत्येक कमांड के लिए उत्पन्न कई .cs फ़ाइलों की तरह नहीं है, दूसरों को पसंद है कि सब कुछ के माध्यम से वायर्ड हो CommandBindings। मैं एक नुकसान में हूँ। क्या कोई किसी तरह का प्रकाश डाल सकता है?

उत्तर:

जवाब के लिए 2 № 1

विचार करने के लिए दो बिंदु:

विभिन्न MVVM द्वारा प्रदान किए गए आदेशCommandSinkCommand या SimpleCommand (Cinch से), आदि जैसे चौखटे सामान्य ICommands करते हैं। विशेष रूप से, जब भी WPF का मानना ​​है कि ऐसा कुछ हुआ है जिससे UI परिवर्तन हो सकता है, तो CanExecute हैंडलर का मूल्यांकन किया जाता है। आप इसके माध्यम से मैन्युअल रूप से बाध्य कर सकते हैं CommandManager.InvalidateRequerySuggested().

इसके विपरीत, प्रिज़्म के डेलिगेटकमंड्स <> CanExecute हैंडलर को तब तक कॉल नहीं करते जब तक आप मैन्युअल रूप से कॉल नहीं करते RaiseCanExecuteChanged() आज्ञा पर। यदि आप इसे बदलना चाहते हैं, तो यह भी निकाल दिया जाता है जब आदेशों की सामान्य रूप से आवश्यकता होती है, तो कोड देखें http://compositewpf.codeplex.com/Thread/View.aspx?ThreadId=47338

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

दूसरा बिंदु: एमवीवीएम फ्रेमवर्क के कमांड आमतौर पर ऑब्जेक्ट को कमांड पैरामीटर के रूप में स्वीकार करते हैं। इसके विपरीत, प्रिज्म के डेलिगेटकमंड्स <> अधिक दृढ़ता से टाइप किए जाते हैं (हालांकि यदि आप चाहते हैं तो आपके पास निश्चित रूप से एक डेलिगेटकमैंड्स हो सकते हैं)।


जवाब के लिए 3 № 2

अच्छा - मुझे लगता है कि वहाँ नहीं है "टी the समाधान.

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

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

आप उन्हें भी जोड़ सकते हैं: डेलीगेटकमांड का उपयोग करें और इसके अतिरिक्त जोशस्मिथ संस्करण का उपयोग करें - ताकि आप दोनों के फायदे जोड़ सकें।केवल एक चीज आप की जरूरत है कुछ सहायक वर्गों-वास्तव में लागू करने के लिए मुश्किल नहीं है ।

आपके आवेदन में बहुत अधिक महत्वपूर्ण है: यदि आपने तय किया है कि आप क्या उपयोग करना चाहते हैं, तो आपको अपने पूरे आवेदन के माध्यम से इस तरह का पालन करना चाहिए।