2016-03-10 6 views
8

RelayCommand की एक बहुत ही आम कार्यान्वयन निम्नलिखित पंक्तियों को शामिल कर लगता है:क्या रिलेकॉमैंड का एमवीवीएम पैटर्न का उल्लंघन करने का सामान्य कार्यान्वयन है?

public event EventHandler CanExecuteChanged 
{ 
    add 
    { 
     CommandManager.RequerySuggested += value; 
    } 
    remove 
    { 
     CommandManager.RequerySuggested -= value; 
    } 
} 

यह मेरे लिए बहुत त्रुटिपूर्ण लगता है, क्योंकि CommandManager एक WPF घटक है और आम तौर पर मेरी आज्ञाओं एक viewmodel वर्ग में स्थित हैं। चूंकि व्यूमोडेल को दृश्य को नहीं जानना चाहिए और विभिन्न ढांचे के साथ काम करना चाहिए और ऐसा, यह मेरे लिए बहुत अजीब लगता है। उदाहरण के लिए इस कार्यान्वयन भले ही आप एक अतिरिक्त परियोजना, कि WPF नाम स्थान (जैसे PCL) पता नहीं है में अपने viewmodel अलग संभव नहीं होगा।

इस कार्यान्वयन MVVM पैटर्न का उल्लंघन है?
या आप शायद किसी भी तरह आपके विचार में RelayCommand डालूं?
अगर यह वास्तव में त्रुटिपूर्ण, वहाँ एक सबसे अच्छा अभ्यास कार्यान्वयन इस समस्या को हल करती है है?

+0

अपने viewmodel अपने दृश्य के लिए है, बस इसे संदर्भित नहीं। तो ये ठीक है। – blindmeis

+0

@blindmeis एक दृश्य घटक का उपयोग करके यह वास्तव में इसका संदर्भ दे रहा है।यदि आप इस रिलेकॉमैंड कार्यान्वयन को गैर-डब्ल्यूपीएफ एप्लिकेशन में उपयोग करने का प्रयास करते हैं तो यह बहुत स्पष्ट हो जाता है। –

+0

मुझे नहीं लगता कि आप किसी अन्य गैर-WP अनुप्रयोग में wpf के लिए viemodel का उपयोग करेंगे :) मुख्य उद्देश्य यूआई के बिना परीक्षण कर रहा है और यह काम करता है। – blindmeis

उत्तर

3

यह एक आसान और तेज़ & गंदे कार्यान्वयन अधिकतर केवल ट्यूटोरियल मामलों के लिए उपयोग किया जाता है जो एक विशिष्ट एमवीवीएम फ्रेमवर्क के लिए ट्यूटोरियल नहीं जोड़ते हैं, लेकिन सामान्य रूप से एमवीवीएम ट्यूटोरियल के रूप में कार्य करते हैं।

यह दृष्टिकोण - तंग युग्मन के अलावा अन्य - कई अन्य नुकसान है।

जब CommandManager.InvalidateRequerySuggested() विधि कहा जाता है, तो प्रत्येक आदेश के CanExecute विधि को कॉल किया जाएगा। यदि आपके आवेदन में 100 से कमांड हैं, तो इसका आपके WPF एप्लिकेशन के प्रदर्शन पर गंभीर प्रभाव हो सकता है।

मैं व्यक्तिगत रूप से हमेशा एक परिपक्व MVVM फ्रेमवर्क उपयोग करने का सुझाव (प्रिज्म LOB अनुप्रयोगों के लिए मेरी पसंदीदा किया जा रहा है)। वहाँ आदेशों आमतौर पर यह इस तरह से लागू नहीं है, लेकिन आप MyCommand.OnCanExecuteChanged() फोन (प्रिज्म के मामले में) एक ही आदेश के लिए CanExecute मान्यता को गति प्रदान करने।

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

इस कार्यान्वयन MVVM पैटर्न का उल्लंघन है?

तकनीकी तौर पर हाँ।

या आप शायद RelayCommand अपने ध्यान में रखते हुए किसी भी तरह डालूं?

नहीं वास्तव में, हालांकि आप एक बाहरी कारखाने के साथ यह सार करने में सक्षम हो सकता है, यह (मुद्दा ऊपर देखें)

अगर यह वास्तव में दोषपूर्ण है समझ बनाने के लिए लगता है नहीं है, है वहाँ एक सर्वोत्तम अभ्यास कार्यान्वयन जो इस मुद्दे को हल करता है?

वैसे भी आदेशों का वैश्विक अमान्यता नहीं है। आदेशों अपने आप को एक साथ बंधे उनके निष्पादन राज्य की जरूरत है कि बाँध।

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