2015-05-13 62 views

回答

14

標準方法是簡單地綁定到viewmodel中的bool類型的屬性,然後在此屬性的setter中執行您的邏輯。你的綁定,然後將這個樣子:

local:MvxBind="Checked IsChecked" 

但是如果你真的需要綁定命令,你也可以綁定到Click事件:

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

視圖模型:

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 
     }); 
    } 
} 

注意你不會收到你的命令參數中複選框的值,所以你仍然需要綁定到bool屬性。這個解決方案的另一個問題是,你必須依靠一個事實,你的財產的設置者會在你的命令之前被調用。

如果你真的需要有bool參數的命令,那麼你絕對可以做到這一點。關於MvvmCross框架的令人敬畏的事情是,您可以隨時擴展其功能。在你的情況下,你需要實現CheckBox的自定義綁定。好的起點可能在這裏:http://slodge.blogspot.cz/2013/06/n28-custom-bindings-n1-days-of-mvvmcross.html

編輯:爲了說明它是多麼容易,我試了一下,並用bool參數實現了簡單的命令綁定。 (不能執行檢查)。如果有人感興趣,這裏是代碼。
Binding類:

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" /> 

最後視圖模型:

public ICommand CheckBoxCheckedCommand 
{ 
    get 
    { 
     return new MvxCommand<bool>(isChecked => 
     { 
      var parameter = isChecked; 
     }); 
    } 
}