2011-05-03 20 views
7

मैं MVVM लाइट का उपयोग कर रहा है और मैं अपने रिले आदेश पूरी तरह से काम कर रहा है, मैं सिर्फ पढ़ा है कि मैं CanExecuteChanged और CanExecute को लागू किया जाना चाहिए। हालांकि मैं एक अच्छा उदाहरण खोजने में असमर्थ हूं।CanExecute और CanExecuteChanged, मुझे इन्हें रिलेकॉमैंड के साथ कार्यान्वित करना होगा?

किसी को भी कैसे इन लागू करने के लिए का एक अच्छा उदाहरण है।

CanExecute झूठी वापस जाने के लिए जब यह निष्पादित नहीं किया जा सकता है की जरूरत है, लेकिन सिर्फ बटन disbale नहीं होगा ??

जब मैं CanExecuteChanged पर अमल करते हैं?

किसी के पास प्रत्येक का उपयोग करने के लिए कोई अच्छा उदाहरण है, मेरा कोड this blog पोस्ट राज्यों के बिना काम करता है कि मुझे इन वस्तुओं को लागू करना चाहिए।

मैं थोड़ा उलझन में हूं, जैसा कि मैंने कहा था कि मैंने सोचा था कि मैं सिर्फ Enabled संपत्ति या व्यूमोडेल में किसी संपत्ति के लिए कुछ बांध दूंगा ताकि मैं बटन या इसी तरह के नियंत्रण को अक्षम कर सकूं?

समझ में किसी भी मदद वास्तव में आभारी होंगे।

संपादित

यह वही है मैं अब अपने काम करने के लिए है ... लेकिन बटन शारीरिक रूप से केवल commmand अक्षम नहीं है नहीं चलता है के रूप में मैं झूठे लौट रहा हूं। मैं निर्माता को चलाने के लिए मजबूर करने के लिए RaiseCanExecuteChanged में CanExecuteMe बोल रहा हूँ ...

यह मेरा viewmodel

 this.Page2Command = new RelayCommand(() => this.GoToPage2(),() => CanExecuteMe); 

     CanExecuteMe = false; 

की मेरी कंसट्रक्टर में चलता है और यहाँ मेरे कोड के बाकी है, मैं एक उदाहरण से ले लिया ।

private bool _canIncrement = true; 

    public bool CanExecuteMe 
    { 
     get 
     { 
      return _canIncrement; 
     } 

     set 
     { 
      if (_canIncrement == value) 
      { 
       return; 
      } 

      _canIncrement = value; 

      // Update bindings, no broadcast 
      //RaisePropertyChanged(CanIncrementPropertyName); 

      Page2Command.RaiseCanExecuteChanged(); 
     } 
    } 

    public RelayCommand Page2Command 
    { 
     get; 
     private set; 
    } 

    private object GoToPage2() 
    { 
     System.Windows.MessageBox.Show("Navigate to Page 2!"); 
     return null; 
    } 

और यहाँ मेरी XAML

<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="31,77,0,0" x:Name="button1" VerticalAlignment="Top" Width="75" > 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="Click"> 
        <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding Page2Command, Mode=OneWay}"/> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
     </Button> 

उत्तर

10

CanExecute कहा जाता है जब बटन निर्धारित करने के लिए करता है, तो यह सक्षम है या किया जाना चाहिए नहीं की जरूरत है।

बटन बंधन पर ऐसा करता है, और हर बार CanExecuteChanged आग के बाद (बटन अपने आदेश के लिए इस घटना को सुनता है)।

इसलिए, यदि बटन अक्षम किया जाना चाहिए, तो आपको CanExecuteChanged आग लगनी चाहिए, और जब बटन CanExecute को कॉल करता है, तो आपको false वापस करना चाहिए। कमांड बाइंडिंग का उपयोग करते समय बटन को सक्षम/अक्षम करने का यह पसंदीदा तरीका है।

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

+0

धन्यवाद, ठीक है, मैंने यह काम किया है और यकीन है कि बटन निष्पादित नहीं होता है क्योंकि यह झूठा लौटाता है। लेकिन बटन "अभी भी" सक्षम है ... मैं अपने प्रश्न के साथ अपना प्रश्न अपडेट करूंगा .. शायद मैं कुछ गलत कर रहा हूं। – Martin

+0

ठीक सवाल अपडेट किया गया, उम्मीद है कि – Martin

+2

समझ में आता है ठीक है, यह एक संपत्ति है जिसे MustToggleIsEnabledValue कहा जाता है जिसे मुझे सेट करना होगा .. मैं इस प्रश्न को उत्तर के रूप में उत्तर दूंगा क्योंकि इस उत्तर ने मेरे प्रश्न का उत्तर दिया है। – Martin

1

आपको CanExecute predicate का उपयोग करके बहुत सावधान रहना चाहिए। यह प्रत्येक यूआई परिवर्तन पर जांच करता है और प्रत्येक कुंजीपटल कुंजी के लिए किसी भी क्षेत्र में प्रवेश किया जाता है।

इससे प्रदर्शन समस्याएं हो सकती हैं!