2014-10-10 7 views
6

मैंने एमवीएमएम लाइट को संस्करण 5 में अपडेट किया और देखा कि RelayCommand काम करना बंद कर दिया।एमवीवीएम लाइट को संस्करण 5 में अपडेट करने के बाद, मुझे रिलेकॉमंड CanExecute() काम करने के लिए किन परिवर्तनों की आवश्यकता है?

समस्या यह प्रतीत होती है कि CanExecute() को सत्यापित करने के लिए नहीं कहा जा रहा है। यह केवल एक बार मान्य करता है, जैसे विंडो लोड होने पर।

क्या यह हालिया अपडेट से एक बग हो सकता है या क्या मुझे XAML में कुछ बदलने की आवश्यकता है?

सब कुछ अपडेट से ठीक पहले काम कर रहा था। मैं डब्ल्यूपीएफ के साथ काम कर रहा हूँ।

+0

वही समस्या, आपको पहले अपनी पोस्ट मिलनी चाहिए थी। मुझे पिछले संस्करण में डाउनग्रेड करना पड़ा। –

उत्तर

9

देखें इस MVVM Light 5 issue:

WPF केवल XAML ढांचे को CommandManager का उपयोग करता है स्वतः ICommands पर CanExecuteChanged घटना बढ़ा है। मैंने कभी भी को "जादू" भाग की वजह से उस दृष्टिकोण को पसंद नहीं किया है, लेकिन यह WP12 का "सुविधा" है और निश्चित रूप से मुझे इसका समर्थन करना होगा। यहां कोई सवाल नहीं है।

वी 5 में, मैं WPA4.5 सहित XAML ढांचे के सभी नवीनतम संस्करण के लिए पोर्टेबल क्लास लाइब्रेरी में स्थानांतरित हुआ। दुर्भाग्यवश, पीसीएल में कोई कमांड मैनेजर नहीं है, और मुझे यह मानना ​​है कि मुझे पहली बार पहली बार का एहसास नहीं हुआ। तो निश्चित रूप से अब ऑटोमैजिकल हिस्सा काम नहीं करता है। फिर, इसके बारे में बहुत खेद है।

मैं आप अपने आवेदन, जो क्या WPF टीम का इरादा है में CommandManager उपयोग करने के बाद हर जगह CanExecuteChanged बढ़ाने के लिए अब, नहीं उम्मीद नहीं कर रहा हूँ। तो मैं टूलकिट के WPF4.5 संस्करण में कमांडमैनेजर उपयोग को पुनर्स्थापित करने का तरीका खोजने का प्रयास करूंगा।

निश्चित रूप से बहाने की तलाश नहीं कर रहा है;) लेकिन उम्मीद है कि समस्या उत्पन्न होने के कारण यह समझने में मदद मिलती है। यह मेरी प्राथमिकता नंबर 1 होगी जब तक कि मुझे पीसीएल संस्करण में इसे हल करने का कोई तरीका न मिल जाए। इस बीच, जैसा कि मैंने पहले उल्लेख किया था, मुझे लगता है कि पर वापस जाकर V4.4.32.7 को ठीक करना चाहिए।यदि यह नहीं करता है तो कृपया मुझे बताएं।

तो अस्थायी सिफारिश समाधान वापस पिछले संस्करण पर वापस लौटने की है। मैंने ऐसा किया था और इसने काम किया।

मैं मानता हूं कि कमांड प्रबंधक "जादू" कर रहा है। एक बार जब मुझे CanExecute स्थिति में शून्य संदर्भ अपवाद था और नतीजतन मैंने विंडोज सॉलिटेयर में कार्ड जैसे त्रुटि संदेशों के घूमने वाले चक्र को प्राप्त किया है। अगर मैंने एक नई परियोजना शुरू की है तो मैं इस "जादू" का उपयोग नहीं करना चाहूंगा लेकिन मौजूदा और पहले से ही तैनात परियोजना को बदलने के लिए काफी दर्दनाक होगा।

+3

संस्करण 5.0.2 में फिक्स्ड। –

+18

v5.0.2 में फिक्स का उपयोग करने के लिए GalaSoft.MvvmLight.Command से नेमस्पेस को बदलना सुनिश्चित करें; GalaSoft.MvvmLight.Command ** Wpf **; – mips

+0

@ मिप्स रूस से बहुत धन्यवाद! =) मेरे लिए काम किया! – Vladislav

0

ऐसा लगता है कि जब भी कोई प्रासंगिक संपत्ति बदल जाती है तो आपको आदेश पर RaiseCanExecuteChanged को कॉल करना होगा। मुझे लगता है कि यह पहले wpf कमांड मैनेजर द्वारा किया गया था, लेकिन हाल ही में पीसीएल परिवर्तनों ने संभवतः असमर्थनीय बनाया है।

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

Check out this sample

इस के रूप में, पर शक होने लगता है यहाँ कुछ कोड मैं

using GalaSoft.MvvmLight; 
using GalaSoft.MvvmLight.Command; 
using System; 

namespace TestingApp.ViewModel 
{ 
    /// <summary> 
    /// This class contains properties that the main View can data bind to. 
    /// <para> 
    /// Use the <strong>mvvminpc</strong> snippet to add bindable properties to this ViewModel. 
    /// </para> 
    /// <para> 
    /// You can also use Blend to data bind with the tool's support. 
    /// </para> 
    /// <para> 
    /// See http://www.galasoft.ch/mvvm 
    /// </para> 
    /// </summary> 
    public class MainViewModel : ViewModelBase 
    { 
     private Int32 _increment = 0; 

     public Int32 Increment 
     { 
      get { return _increment; } 
      set 
      { 
       _increment = value; 
       RaisePropertyChanged("Increment"); 
       GoCommand.RaiseCanExecuteChanged(); 
      } 
     } 

     /// <summary> 
     /// Initializes a new instance of the MainViewModel class. 
     /// </summary> 
     public MainViewModel() 
     { 
      ////if (IsInDesignMode) 
      ////{ 
      //// // Code runs in Blend --> create design time data. 
      ////} 
      ////else 
      ////{ 
      //// // Code runs "for real" 
      ////} 
     } 

     private RelayCommand _incrementCommand; 

     public RelayCommand IncrementCommand 
     { 
      get 
      { 
       if (_incrementCommand == null) 
       { 
        _incrementCommand = new RelayCommand(IncrementCommand_Execute); 
       } 
       return _incrementCommand; 
      } 
     } 

     private void IncrementCommand_Execute() 
     { 
      Increment++; 
     } 

     private RelayCommand _goCommand; 

     public RelayCommand GoCommand 
     { 
      get 
      { 
       if (_goCommand == null) 
       { 
        _goCommand = new RelayCommand(GoCommand_Execute, GoCommand_CanExecute); 
       } 
       return _goCommand; 
      } 
     } 

     private bool GoCommand_CanExecute() 
     { 
      return Increment > 5; 
     } 

     private void GoCommand_Execute() 
     { 
      // 
     } 
    } 
} 

का परीक्षण किया है लाइन

GoCommand.RaiseCanExecuteChanged(); 

canexecute विधि प्रारंभिक कॉल के बाद कभी नहीं कहा जाता है के बिना है , लेकिन लाइन के साथ इसे हर बार कहा जाता है जब वृद्धि संपत्ति बदलती है

+0

हो सकता है कि अगर आपने वास्तव में कोशिश की कि मैंने जो सुझाव दिया है, तो आप पाएंगे कि मैं वास्तव में सही हूं। तो मैं वास्तव में यह एक बहुत ही उपयोगी जवाब पर विचार करता हूं। मैंने कुछ अतिरिक्त नमूना कोड जोड़ा है जो मैंने परीक्षण किया है और यह काम करता है। – ndonohoe

+0

और कल्पना करें कि आपके पास एक प्रोजेक्ट है और आपको ऐसे सैकड़ों मामलों से गुजरना होगा और सबकुछ फिर से जांचना होगा। क्या आप इसे करना चाहते हैं? –

+0

मैं मानता हूं कि यह पहले से ही कई आदेशों के साथ एक बड़ी परियोजना के लिए बेहतर नहीं है, हालांकि किसी भी व्यक्ति को यह पता लगाने के लिए कि जो सिर्फ एमवीवीएमएलइट से शुरू हो रहा है, यह उन्हें समय बचा सकता है। – ndonohoe

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

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