2010-06-06 16 views
10

मैं MVVM पद्धति का उपयोग कर एक WPF आवेदन, निम्न आलेख के आधार पर लिख रहा हूँ: WPF Apps With The Model-View-ViewModel Design PatternProgramatic MVVM आदेश के पुनर्मूल्यांकन "निष्पादित कर सकते हैं" राज्य

मैं बटन '' के साथ अपने दृश्य पर दो बटन है रिले कॉमांड क्लास के दिए गए उदाहरण के लिए "संपत्ति बाध्य (डेटा बाध्यकारी के साथ) आदेश (उपरोक्त आलेख से" चित्रा 3 रिले कॉमांड क्लास "देखें)। RelayCommand क्लास को यह जांचने के लिए समर्थन है कि दिया गया आदेश निष्पादित किया जा सकता है या नहीं।

WPF स्वचालित रूप से उन बटन को अक्षम करता है जिनके आदेश को निष्पादित नहीं किया जा सकता है।

मेरे प्रत्येक आदेश (व्यूमोडेल क्लास में) पृष्ठभूमि ऑपरेशन शुरू करते हैं, और पृष्ठभूमि ऑपरेशन समाप्त होने तक कमांड को फिर से निष्पादित नहीं किया जा सकता है। RelayCommand उदाहरणों में जानकारी है कि पृष्ठभूमि ऑपरेशन अभी भी काम कर रहा है या यह समाप्त हो गया है।

मेरी समस्या निम्न है: किसी भी बटन को दबाए जाने के बाद, बटन स्वचालित रूप से अक्षम हो जाते हैं (जो ठीक है) क्योंकि पृष्ठभूमि ऑपरेशन शुरू हुआ और आदेश समाप्त होने तक कमांड निष्पादित नहीं किया जा सकता है, लेकिन ऑपरेशन समाप्त होने के बाद , बटन स्वचालित रूप से सक्षम नहीं होते हैं क्योंकि उनके आदेश का "निष्पादित किया जा सकता है" भविष्यवाणी स्वचालित रूप से पुन: मूल्यांकन नहीं किया जाता है। आवेदन को ढीला करके और फोकस प्राप्त करके (ALT + TAB दबाकर) पुनर्मूल्यांकन मैन्युअल रूप से ट्रिगर किया जा सकता है। इस चाल को करने के बाद, बटन एक बार फिर सक्षम हो जाते हैं।

मैं बटन के कमांड के "निष्पादित" स्थिति को प्रोग्रामेटिक रूप से पुनर्मूल्यांकन कैसे कर सकता हूं?

उत्तर

20

आप को सूचित करने के कि CanExecute फिर से पूछे जाना चाहिए CommandManager पर InvalidateRequerySuggested कॉल कर सकते हैं:

CommandManager.InvalidateRequerySuggested(); 

http://msdn.microsoft.com/en-us/library/system.windows.input.commandmanager.invalidaterequerysuggested.aspx

यह है कि क्या विशेष ICommand कार्यान्वयन ठीक से ICommand.CanExecuteChanged पैटर्न लागू किया गया है निर्भर करता है , तो वाईएमएमवी। DelegateCommand:

अद्यतन

उदाहरण के लिए, मैं प्रिज्म जो इसे खुद आधार कार्यान्वयन ICommand है है का उपयोग करें। मुझे लगता है कि प्रिज्म में एक प्रतिनिधिमंडल पर RaiseCanExecuteChanged() को कॉल करना मेरे लिए काम करता है।

अद्यतन 2

और सुनिश्चित करें कि आप यूआई धागे पर InvalidateRequerySuggested() कॉल कर रहे हैं। कॉल करने के लिए आवश्यक होने पर डिस्पैचर का उपयोग करें।

+0

यह वही बात है जो मेरा पहला अनुमान था, लेकिन, मेरे लिए किसी अज्ञात कारण के लिए, यह काम नहीं कर रहा है। मैं इस स्थिर विधि ("CommandManager.InvalidateRequerySuggested") को हर बार प्रोग्राम की स्थिति (जैसे निष्क्रिय, वर्किंग, लंबितस्टॉप इत्यादि) में बदल रहा हूं, यह केवल राज्य की संपत्ति है जो CanExecute हैंडलर में उपयोग की जाती है। फिर भी, यह काम नहीं कर रहा है (हालांकि मैं सहमत हूं कि यह चाहिए)। बीटीडब्लू, जाओ और आईसीओएमएंड कार्यान्वयन की जांच करें, यह आलेख में मैंने पहले संदर्भित किया है, आंकड़ा 3. – dzs

+0

हां यह वास्तव में इस बात पर निर्भर करता है कि आईसीओएमएंड को कैसे लागू किया गया है। मैंने अपने उत्तर को अद्यतन किया है कि मैं प्रिज्म में कैनएक्सक्यूट फिर से पूछताछ कैसे प्राप्त करता हूं। मैं आपके द्वारा अनुसरण किए जा रहे लेख को देखूंगा। –

+0

क्या यह गैर-यूआई थ्रेड पर अमान्य RequerySuggested() निष्पादित करने के साथ संभवतः कुछ करने के लिए है?इसे कॉल करने के लिए डिस्पैचर का उपयोग करने का प्रयास करें, ताकि इसे यूआई थ्रेड पर बुलाया जा सके। –

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