पर क्लिक नहीं किया जाता है मेरा ऐप WPF में एमवीवीएम पैटर्न का उपयोग करके लिखा जाता है, और मेरे सभी बटन मेरे मॉडल में कोड निष्पादित करने के लिए कमांड बाइंडिंग का उपयोग करते हैं। बाध्य बटन के सक्षम राज्य को निर्धारित करने के लिए सभी आदेशों में CanExecute में कोड है। तर्क पूरी तरह से काम करता है, लेकिन सभी मामलों में, जीयूआई एक अक्षम राज्य में रहता है जब तक कि मैं जीयूआई में कहीं और क्लिक नहीं करता।अजीब समस्या जहां बटन को फिर से सक्षम नहीं किया जाता है जब तक कि माउस
उदाहरण के लिए, मेरे पास डिस्कार्ड कैंडी नामक एक बटन है। जब मैं इस बटन पर क्लिक करता हूं, तो यह एक थ्रेडपूल थ्रेड में एक प्रक्रिया लॉन्च करता है, जो सच पर रनिंग नामक एक बूल प्रॉपर्टी सेट करता है। एक बार प्रक्रिया शुरू के बाद से त्यागें कैंडी के आदेश के लिए CanExecute विधि इस
public bool CanExecute(object parameter)
{
return !Running;
}
तरह दिखता बटन अक्षम हो जाएगा। समस्या यह है कि जब प्रक्रिया पूरी हो जाती है, तो चल रहा है झूठी पर सेट हो जाता है, लेकिन जीयूआई अपडेट नहीं होता है, यानी कैंडी को फिर से सक्षम नहीं किया जाता है।
हालांकि, अगर मैं जीयूआई में कहीं भी क्लिक करता हूं, जैसे विंडो या टाइटल बार पर, कैंडी बटन को छोड़ दें अचानक अचानक सक्षम हो जाता है। तो तर्क काम करता है, लेकिन कुछ चल रहा है कि मैं समझ में नहीं आता। क्या कोई इस व्यवहार को मेरी व्याख्या कर सकता है?
EDIT - अब तक, यह कमांडमैनेजर की तरह लगता है। अविश्वसनीयRequerySuggested लोगों की मदद नहीं की है। मैं इसे एक शॉट देने जा रहा हूं, लेकिन इस समय थोड़ा सा सावधान हूं। मैंने अनुशंसित लिंक का पालन किया, और ऐसा करने में एमवीवीएम लाइट टूलकिट के बारे में अधिक पढ़ने का फैसला किया। यह बहुत अच्छा लगता है - क्या किसी ने यहां इसका उपयोग किया है और यह पुष्टि करने में सक्षम है कि यह उस समस्या को प्रदर्शित नहीं करता है जिसे मैं अब तक देख रहा हूं? हालांकि मैं अगले प्रमुख संशोधन में एमवीवीएम लाइट टूलकिट को आजमाने की योजना बना रहा हूं। मेरे आवेदन के अनुसार, मैं वर्तमान में मौजूद सभी कमांडिंग को दोबारा नहीं करना चाहता हूं, यही कारण है कि मैं कमांडमैनेजर से शुरू करूंगा। इन्वालिडेट रेक्वेरी सुझाया गया ताकि हम सभी को इसकी उपयोगीता के बारे में यहां एक और डेटा पॉइंट मिल सके।
संपादित करें # 2 - बहुत दिलचस्प, MVVM प्रकाश टूलकिट वास्तव में CommandManager.InvalidateRequerySuggested पर आदेश यूआई के निष्क्रिय करने के लिए/आदेशों को पुन: सक्षम की क्षमता का समर्थन करने के लिए निर्भर करता है। लेखक कहते हैं:
"कड़ाई से बोलते हुए, डब्ल्यूपीएफ में, और यदि आपका आदेश कमांड मैनेजर द्वारा देखे गए नियंत्रण के लिए बाध्य है, तो आपको CanExecuteChanged ईवेंट स्वयं को उठाना नहीं चाहिए। आप कमांड मैनेजर को संभालने दे सकते हैं स्थिति ने कहा। बाहरी घटनाएं यूआई की स्थिति को भी बदल सकती हैं। आइए कल्पना करें कि यूआई को 9एएम से 5 पीएम तक सक्षम किया जाना चाहिए, और फिर रात के लिए अक्षम किया जाना चाहिए। उपयोगकर्ता यूआई को ट्रिगर नहीं कर रहा है, इसलिए कोड को अनुरोध करना चाहिए (विनम्रता से) कि CommandManager आदेशों की राज्य requeries। इस विधि CommandManager पर InvalidateRequerySuggested फोन करके किया जाता है। और जैसा कि आप अनुमान लगाया, RelayCommand वर्ग की विधि RaiseCanExecuteChanged सिर्फ इतना है कि नहीं करता है। "
क्या आप कोड दिखा सकते हैं जो गलत पर चल रहा है? थ्रेड पूरा होने के बाद क्या यह कॉलबैक में है? –
क्या आप रनिंग सेट करते समय कमांड के लिए CanExecuteChanged उठा रहे हैं? – itowlson
@ जॉन: वर्कफ़्लो पूरा होने के बाद रनिंग को गलत पर सेट किया गया है, जिसे निर्दिष्ट ईवेंट सेट होने पर जाना जाता है। @itowlson: मैं इस धारणा के तहत था कि सब कुछ "सिर्फ जादुई रूप से काम करेगा"। जब मैं इस सामान को सीख रहा था, तो मैंने CanExecute में ब्रेकपॉइंट लगाया और यह हमेशा हिट हो रहा था ... लेकिन मुझे कल्पना है कि यह केवल इसलिए है क्योंकि जब मैंने एफ 5 मारा, तो जीयूआई पश्चाताप करता है, जिसके बाद CanExecute को फिर से कॉल करने का कारण बनता है। मुझे मूर्ख! – Dave