2015-05-13 15 views

cevap

14

Standart yaklaşım, basit görünümünüzdeki tip boole özelliğine bağlanmak ve mantığınızı bu özelliğin ayarlayıcısında gerçekleştirmek olacaktır. Sizin o zaman bu gibi görünecektir bağlayıcı:

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

ViewModel:

local:MvxBind="Checked IsChecked" 

Ancak eğer gerçekten Komutanlığı bağlamak gerekirse, ayrıca olay tıklayın bağlanabildiği

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

Not o Komut parametrenizdeki onay kutusunun değerini almazsınız, böylelikle yine de boole özelliğine bağlamanız gerekir. Bu çözümle ilgili bir başka problem, bir gerçeğe güvenmeniz gerektiğidir, mülkünüzün belirleyicisi emrinizden önce çağrılır.

Eğer gerçekten bool parametresiyle bir komutunuz varsa, bunu kesinlikle yapabilirsiniz. MvvmCross çerçevesiyle ilgili müthiş şey, her zaman işlevselliğini artırabilmenizdir. Durumunuzda CheckBox için özel ciltleme uygulamanız gerekir. İyi bir başlangıç ​​noktası burada olabilir: http://slodge.blogspot.cz/2013/06/n28-custom-bindings-n1-days-of-mvvmcross.html

Düzeltme: Ne kadar kolay olduğunu göstermek için bunu deneyin ve bool parametresiyle basit bir komut bağlaması uygulayın. (CanExecute kontrolü yok). Birinin ilgilenmesi durumunda, kod burada.
Cilt sınıfı: Setup.cs yılında

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

: En düzende

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

Ve nihayet ViewModel:

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