2011-08-04 18 views
7

XAML में ICommand एस का उपयोग करते समय, WPF कमांड से जुड़े नियंत्रण को सक्षम या अक्षम करने के लिए CanExecute विधि का उपयोग करता है। लेकिन क्या होगा यदि मैं प्रक्रियात्मक कोड से Execute पर कॉल कर रहा हूं? क्या मुझे यह सुनिश्चित करने के लिए पहले CanExecute जांचना चाहिए कि आदेश निष्पादित हो सकता है, या Execute मेरे लिए इस चेक का ख्याल रखना चाहिए?क्या मुझे प्रक्रियात्मक कोड से निष्पादन कॉल करने से पहले आईसीओएमएंड की कैनएक्सक्यूट विधि की जांच करनी चाहिए?

दूसरे शब्दों में, मैं यह कर देना चाहिए:

if (someCommand.CanExecute(parameter, target)) 
    someCommand.Execute(parameter, target); 

या सिर्फ इस:

someCommand.Execute(parameter, target); 
+0

निष्पादन() का यह हिस्सा क्यों न बनाएं? –

उत्तर

6

अच्छा शैली, हुक्म है कि आप पूर्व करना चाहिए पहले CanExecute की जाँच करें। यह उचित अपघटन और कार्यान्वयन में एक स्थिरता लागू करेगा। साथ ही, यदि आप कभी भी इस कमांड को बटन पर बाध्य करना चाहते हैं, तो यह अपेक्षा के अनुसार काम करेगा।

+1

संविदात्मक रूप से, यह "सवार" लगता है। मैं यह भी जोड़ूंगा कि अगर आप जिस स्थिति की जांच कर रहे हैं, वह कमांड के लिए बाहरी राज्य पर किसी भी तरह से निर्भर करता है (और इसलिए किसी अन्य थ्रेड द्वारा संशोधित), तो आप CanExecute/Execute अनुक्रम के आसपास लॉक करना चाहते हैं। – JerKimball

3

आपको केवल निष्पादन कॉल करना चाहिए और आदेश कार्यान्वयन संभाल सत्यापन को देना चाहिए। CanExecute मुख्य रूप से यूआई स्टेट बाइंडिंग के लिए प्रदान किया जाता है।

बहुत सरल एकल-थ्रेडेड परिदृश्यों को छोड़कर, यदि आप पहले CanExecute को कॉल करते हैं तो वहां आसानी से दौड़ की स्थिति हो सकती है जिससे कमांड वैधता CanExecute और निष्पादन कॉल के बीच बदल जाती है, जिसे CanExecute व्यर्थ पर कॉल को प्रस्तुत किया जाता है।

+0

मुझे नहीं पता कि कैनएक्सक्यूट को कॉल करने के आधार पर दौड़ की स्थिति अलग-अलग कैसे व्यवहार करेगी, फिर निष्पादन को निष्पादित करने के विरुद्ध निष्पादित करें। उन कॉलों को अनुक्रमिक रूप से परवाह किए बिना निष्पादित किया जाएगा। यदि आप पृष्ठभूमि थ्रेड का जिक्र कर रहे हैं, तो यह संभव है कि निष्पादन के बीच में एक संदर्भ स्विच हो क्योंकि CanExecute और निष्पादन के बीच एक होना है। – themaestro

+1

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

+0

आदेश का अंतर्निहित डेटा निष्पादन में किसी भी बिंदु पर बदल सकता है चाहे आप निष्पादन कॉल या CanExecute कॉल के भीतर जांचें या नहीं। हालांकि, यदि आवश्यक हो तो मैं सिंक्रनाइज़ करने के लिए केस को देखता हूं। हालांकि, मैं तर्क दूंगा कि यह मामूली बात है, और जब रेस की स्थिति के लिए प्रवण होता है, तो सामान्य डिजाइन में यह CanExectue का उपयोग करने के लिए बेहतर स्टाइलिस्टिक रूप से बेहतर होता है। – themaestro

2

आपको पहले CanExecute को कॉल करने की आवश्यकता है, ऐसा कुछ भी नहीं है जो कहता है कि आईसीओएमएंड को लागू करने वाली कक्षाएं उनके निष्पादन विधि में उनके CanExecute को जांचती हैं।