2012-10-18 12 views
7

साथ CanExecute का उपयोग कैसे करें मैं एक बटनMvvmcross

<Button 
     android:id="@+id/ButtonConnect" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Disconnect" 
     local:MvxBind="{'Click':{'Path':'DisconnectCommand'}}" /> 

है और मैं एक कमान है के लिए यह

public IMvxCommand DisconnectCommand 
{ 
    get 
    { 
     return new MvxRelayCommand(this.GetService<IConnectionService>().Disconnect); 
    } 
} 

तो मैं का उपयोग कर सक्रिय/DisconnectCommand को निष्क्रिय चाहते

DisconnectCommand.CanExecute(this.GetService<IConnectionService>().UsbConnected); 

लेकिन यह स्पष्ट रूप से गलत है (यह काम नहीं कर रहा है), मैंने चेक पैरामीटर के रूप में चेक किया है, लेकिन आम तौर पर मैं

करता हूं
DisconnectCommand.CanExecute = someBool; 

लेकिन सेट करने की कोई संपत्ति नहीं है, तो इस बारे में कैसे जाना है?

+0

'UsbConnected' विधि या संपत्ति है? –

+0

यह एक संपत्ति है – Mech0z

उत्तर

7

CanExecute का उपयोग करने के तरीके को जानने के लिए, सिल्वरलाइट या डब्ल्यूपीएफ पर एक नज़र डालें - वहां बहुत से ब्लॉग हैं जो ICommand का उपयोग करने के बारे में बात करते हैं - उदा। http://weblogs.asp.net/nmarun/archive/2009/12/02/using-icommand-silverlight-4.aspx या http://blog.galasoft.ch/archive/2009/09/26/using-relaycommands-in-silverlight-and-wpf.aspx

एक उदाहरण कुछ की तरह:

private MvxRelayCommand _disconnectCommand; 
public IMvxCommand DisconnectCommand 
{ 
    get 
    { 
     if (_disconnectCommand == null) 
      _disconnectCommand = new MvxRelayCommand(this.GetService<IConnectionService>().Disconnect, item => this.IsItemConnected(item)); 
     return _disconnectCommand; 
    } 
} 

private void SomeServiceNotificationHandler() 
{ 
    _disconnectCommand.RaisePropertyChanged(); 
} 

private bool IsItemConnected(object thing) 
{ 
    return /* your code */; 
} 

एक छोटी सी समस्या है, हालांकि नहीं है ....

CanExecute वास्तव में पूरी तरह से भर में सभी MvxBindings भर में लागू नहीं है सभी प्लेटफार्म ... यह उनमें से कुछ के लिए काम करेगा, लेकिन उनमें से कुछ के लिए यह नहीं होगा - और मैं वास्तव में नहीं जानता कि वर्तमान में कौन से लोग हैं! आप मुद्दों के पार चलो, तो मुझे पता है (GitHub मुद्दों के माध्यम से) और वे तय हो जाएगी तो कृपया ...


निजी तौर पर ... मैं CanExecute का उपयोग करते हैं नहीं है - मैं एक का उपयोग करने के बजाय करते हैं अलग बूलियन संपत्ति जो मैं तब भी नियंत्रण पर उपलब्ध संपत्ति के लिए बाध्य करता हूं - उदाहरण के लिए सबसे नियंत्रण Enabled की तरह कुछ, IsEnabled, Disabled, IsDisabled, आदि

मैं आम तौर पर यह आसान (और अधिक पठनीय) बूलियन गुण सेट के बजाय RaiseCanExecuteChanged

कॉल करने के लिए करने के लिए उदा मैं की तरह कुछ का उपयोग करेंगे:

<Button 
    android:id="@+id/ButtonConnect" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="Disconnect" 
    local:MvxBind="{'Click':{'Path':'DisconnectCommand'},'Enabled':{'Path':'UsbConnected'}}" /> 

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

+1

मुझे लगता है कि निर्मित कार्यक्षमता का उपयोग न करना एक बुरा विचार है। बुलियन के साथ आपका दृष्टिकोण कोड आधार पर बहुत अधिक अव्यवस्था जोड़ता है। –

+2

हाँ ... लेकिन आप वह नहीं हैं जो मोनोड्रॉइड और मोनो टच के लिए सभी बाइंडिंग लिखना है :) – Stuart

+0

क्षमा करें, मुझे यह समझ में नहीं आता है :-) –

3

स्टुअर्ट के उत्तर पर अनुवर्ती करने के लिए, एंड्रॉइड और आईओएस एमवीएक्स बाइंडिंग का समर्थन करने के लिए गुणों को उजागर करने के साथ ICommand.CanExecute दोनों का समर्थन करना आसान है।

ऐसा करने के लिए, गुणों के अपने ठेठ CanExecute() तरीके कन्वर्ट तो CanExecuteChanged कि जुड़े संपत्ति पर RaisePropertyChanged कॉल करने के लिए संचालकों जोड़ें। फिर सामान्य के रूप में RaiseCanExecuteChanged का उपयोग करें और PropertyChanged ईवेंट भी निकाल दिया जाता है।

... 

    // constructor 
    public SomeClass() 
    { 

     DoSomethingCommand = new MvxCommand(OnDoSomething,() => CanDoSomething); 
     DoSomethingCommand .CanExecuteChanged += (sender, args) => RaisePropertyChanged(() => CanDoSomething); 
    } 

    public bool CanDoSomething 
    { 
     get { ... } 
    } 

    ... 

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

  • कोई संबंधित समस्या नहीं^_^