2015-05-13 8 views

उत्तर

14

मानक दृष्टिकोण केवल आपके व्यूमोडेल में प्रकार के बूल की संपत्ति से जुड़ना होगा और इस संपत्ति के सेटटर में अपना तर्क निष्पादित करना होगा। आपका बंधन तो इस तरह दिखेगा:

local:MvxBind="Checked IsChecked; Click YourCommand;" 

ViewModel:

local:MvxBind="Checked IsChecked" 

लेकिन अगर तुम सच में कमान करने के लिए बाध्य की जरूरत है, तो आप भी क्लिक करने के लिए घटना बाध्य कर सकते हैं

private bool _isChecked; 

public bool IsChecked 
{ 
    get { return _isChecked; } 
    set 
    { 
     _isChecked = value; 
     RaisePropertyChanged(() => IsChecked); 
    } 
} 

public ICommand YourCommand 
{ 
    get 
    { 
     return new MvxCommand(() => 
     { 
      var isChecked = IsChecked; 
      //Now you can use isChecked variable 
     }); 
    } 
} 

ध्यान दें कि आप अपने कमांड पैरामीटर में चेकबॉक्स का मान प्राप्त नहीं करते हैं, इसलिए आपको बूल प्रॉपर्टी को बाध्य करने की ज़रूरत है। इस समाधान के साथ एक और समस्या यह है कि आपको एक तथ्य पर भरोसा करना चाहिए, कि आपकी संपत्ति के सेटटर को आपके आदेश से पहले बुलाया जाएगा।

यदि आपको वास्तव में बूल पैरामीटर के साथ कमांड की आवश्यकता है, तो आप निश्चित रूप से ऐसा कर सकते हैं। एमवीवीएमक्रॉस ढांचे के बारे में बहुत बढ़िया बात यह है कि आप हमेशा इसकी कार्यक्षमता बढ़ा सकते हैं। आपके मामले में आपको चेकबॉक्स के लिए कस्टम बाध्यकारी लागू करने की आवश्यकता होगी। अच्छा प्रारंभिक बिंदु यहाँ हो सकता है: http://slodge.blogspot.cz/2013/06/n28-custom-bindings-n1-days-of-mvvmcross.html

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

public class CheckBoxChangedBinding 
    : MvxAndroidTargetBinding 
{ 
    private ICommand _command; 

    protected CheckBox View 
    { 
     get { return (CheckBox) Target; } 
    } 

    public CheckBoxChangedBinding(CheckBox view) 
     : base(view) 
    { 
     view.CheckedChange += CheckBoxOnCheckedChange; 

    } 

    private void CheckBoxOnCheckedChange(object sender, CompoundButton.CheckedChangeEventArgs e) 
    { 
     if (_command == null) 
      return; 
     var checkBoxValue = e.IsChecked; 
     _command.Execute(checkBoxValue); 
    } 


    protected override void SetValueImpl(object target, object value) 
    { 
     _command = value as ICommand; 
    } 

    public override MvxBindingMode DefaultMode 
    { 
     get { return MvxBindingMode.OneWay; } 
    } 

    public override Type TargetType 
    { 
     get { return typeof (ICommand); } 
    } 

    protected override void Dispose(bool isDisposing) 
    { 
     if (isDisposing) 
     { 
      var view = View; 
      if (view != null) 
      { 
       view.CheckedChange -= CheckBoxOnCheckedChange; 
      } 
     } 
     base.Dispose(isDisposing); 
    } 
} 

Setup.cs में:

protected override void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry) 
{ 
    base.FillTargetFactories(registry); 
    registry.RegisterCustomBindingFactory<CheckBox>("CheckedChanged", 
     checkBox => new CheckBoxChangedBinding(checkBox)); 
} 

अपने लेआउट में:

<CheckBox 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" 
    local:MvxBind="CheckedChanged CheckBoxCheckedCommand" /> 

और अंत में ViewModel:

public ICommand CheckBoxCheckedCommand 
{ 
    get 
    { 
     return new MvxCommand<bool>(isChecked => 
     { 
      var parameter = isChecked; 
     }); 
    } 
} 
संबंधित मुद्दे