2010-02-25 14 views
19

पर क्लिक नहीं किया जाता है मेरा ऐप 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 सिर्फ इतना है कि नहीं करता है। "

+0

क्या आप कोड दिखा सकते हैं जो गलत पर चल रहा है? थ्रेड पूरा होने के बाद क्या यह कॉलबैक में है? –

+0

क्या आप रनिंग सेट करते समय कमांड के लिए CanExecuteChanged उठा रहे हैं? – itowlson

+0

@ जॉन: वर्कफ़्लो पूरा होने के बाद रनिंग को गलत पर सेट किया गया है, जिसे निर्दिष्ट ईवेंट सेट होने पर जाना जाता है। @itowlson: मैं इस धारणा के तहत था कि सब कुछ "सिर्फ जादुई रूप से काम करेगा"। जब मैं इस सामान को सीख रहा था, तो मैंने CanExecute में ब्रेकपॉइंट लगाया और यह हमेशा हिट हो रहा था ... लेकिन मुझे कल्पना है कि यह केवल इसलिए है क्योंकि जब मैंने एफ 5 मारा, तो जीयूआई पश्चाताप करता है, जिसके बाद CanExecute को फिर से कॉल करने का कारण बनता है। मुझे मूर्ख! – Dave

उत्तर

17

डब्ल्यूपीएफ कमांड बाध्य नियंत्रण अद्यतन नहीं करता है जब तक इसका कोई कारण न हो। जीयूआई पर क्लिक करने से WPF रीफ्रेश करने का कारण बनता है ताकि अपडेट फिर काम कर सके।

आप CommandManager.InvalidateRequerySuggested पर कॉल करके मैन्युअल रूप से किसी भी कमांड बाध्य नियंत्रण का ताज़ा कर सकते हैं।

+1

धन्यवाद, कैमरून, मैं इसे एक शॉट दूंगा। क्या यह एक उचित अंतराल के साथ एक टाइमर में रखना लंगड़ा है? – Dave

+1

शायद। प्रसंस्करण समाप्त करने के बाद क्या आप इसे कॉल कर सकते हैं? –

+7

मैंने वही व्यवहार देखा है डेव कमांडमैनेजर को निष्पादित कर रहा है और निष्पादित किया गया है। अविश्वसनीय रूप से सुझाए गए सुझावों ने मदद नहीं की। मुझे उम्मीद है कि यहां कोई व्यक्ति कुछ अंतर्दृष्टि प्रदान कर सकता है कि कभी-कभी ऐसा क्यों होता है। – Kilhoffer

0

कभी-कभी, अभिभावक नियंत्रण पर ध्यान केंद्रित करने से कमांडमैनेजर ट्रिगर CanExecute को बनाता है।गलत पर चल रहा है सेट करने के बाद निम्नलिखित का प्रयास करें:

... 
Running = false; 
parentControl.Focusable = true; 
parentControl.Focus(); 
2

मेरे समस्या कमान बाइंडिंग के लिए बाध्य होने के लिए लग रहा था - मैं RelayCommand इस्तेमाल किया के रूप में मैं अक्सर करते हैं लेकिन एक बटन के प्रतिपादन सिर्फ सही जब तक मैं एक क्लिक नहीं किया था खिड़की।

CommandBinding से CanExecute कोड निकालना और एक सिर दर्द के बिना मेरी समस्या का समाधान करने के बजाय एक IsEnabled संपत्ति का उपयोग कर - यह बस हमेशा के लिए ले लिया जब तक मैं बहुत से अन्य चीजें हैं जो peoblem हो सकता था के बीच इस कोशिश की ...

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

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