代码之家  ›  专栏  ›  技术社区  ›  Jim Wilcox

MvvmCross自定义事件绑定事件参数

  •  3
  • Jim Wilcox  · 技术社区  · 11 年前

    我已经使用MvvmCross为EditText上的FocusChange事件创建了自定义绑定。我可以将事件绑定并激发,但无法确定如何传递事件参数。我的自定义绑定是这样的

    using Android.Views;
    using Android.Widget;
    using Cirrious.MvvmCross.Binding;
    using Cirrious.MvvmCross.Binding.Droid.Target;
    using Cirrious.MvvmCross.Binding.Droid.Views;
    using Cirrious.MvvmCross.ViewModels;
    using System;
    
    namespace MPS_Mobile_Driver.Droid.Bindings
    {
        public class MvxEditTextFocusChangeBinding
            : MvxAndroidTargetBinding
        {
            private readonly EditText _editText;
            private IMvxCommand _command;
    
            public MvxEditTextFocusChangeBinding(EditText editText) : base(editText)
            {
                _editText = editText;
                _editText.FocusChange  += editTextOnFocusChange;
            }
    
            private void editTextOnFocusChange(object sender, EditText.FocusChangeEventArgs eventArgs)
            {
                if (_command != null)
                {
                    _command.Execute( eventArgs );
                }
            }
    
            public override void SetValue(object value)
            {
                _command = (IMvxCommand)value;
            }
    
            protected override void Dispose(bool isDisposing)
            {
                if (isDisposing)
                {
                    _editText.FocusChange -= editTextOnFocusChange;
                }
                base.Dispose(isDisposing);
            }
    
            public override Type TargetType
            {
                get { return typeof(IMvxCommand); }
            }
    
            protected override void SetValueImpl(object target, object value)
            {
            }
    
            public override MvxBindingMode DefaultMode
            {
                get { return MvxBindingMode.OneWay; }
            }
        }
    }
    

    我在ViewModel中将其连接为:

    public IMvxCommand FocusChange
    {
        get
        {
            return new MvxCommand(() =>
                OnFocusChange()
                );
        }
    }
    
    private void OnFocusChange()
    {
        //Do Something
    }
    

    有没有办法做类似的事情

    public IMvxCommand FocusChange
    {
        get
        {
            return new MvxCommand((e) =>
                OnFocusChange(e)
                );
        }
    }
    
    private void OnFocusChange(EditText.FocusChangeEventArgs e)
    {
        //Do Something
    }
    

    我试图在那里做的事情不起作用,但我希望有类似的事情可能起作用。当命令在带有此行的自定义绑定中触发时,我能够传递事件参数

                _command.Execute( eventArgs );
    

    我只是想不出在ViewModel中捕捉它们的方法。有人能帮我吗?

    吉姆

    1 回复  |  直到 11 年前
        1
  •  4
  •   Jim Wilcox    11 年前

    在尝试了许多不同的安排后,我发现连接MvxCommand的正确语法是

    public IMvxCommand FocusChange
    {
        get
        {
            return new MvxCommand<EditText.FocusChangeEventArgs>(e => OnFocusChange(e));
        }
    }
    
    private void OnFocusChange(EditText.FocusChangeEventArgs e)
    {
        if (!e.HasFocus)
        {
             //Do Something
        }
    }
    

    希望这有帮助!