Xamarin Android与Mvvmcross。在axml中绑定OnEditorAction

时间:2015-04-20 19:05:20

标签: android xamarin xamarin.android mvvmcross

情况:我有一个包含EditText的视图列表。我希望用户能够修改文本,并且当他按下键盘上的完成按钮时,只将新文本发送到viewmodel。我的编辑文本已绑定

<EditText
   android:id="@+id/textNumero"
   android:layout_width="0dp"
   android:layout_height="fill_parent"
   android:layout_weight="0.23"
   android:textColor="#ffffffff"
   local:MvxBind="Text BarilId" />

我在互联网上发现我可以使用此活动来做我想要的事情:

idEditText.OnEditorAction (ImeAction.Done) += //insert delegate here

不幸的是,由于我在我的列表中绑定了该类,因此无法访问我的活动。

所以,我想在我的课程中绑定一个命令:

<EditText
       android:id="@+id/textNumero"
       android:layout_width="0dp"
       android:layout_height="fill_parent"
       android:layout_weight="0.23"
       android:textColor="#ffffffff"
       local:MvxBind="OnEditorAction EditCommand"
       local:MvxBind="Text BarilId" />

命令:

    private IMvxCommand _editCommand;
    public IMvxCommand EditCommand
    {
        get {
            _editCommand = _editCommand ?? new MvxCommand(() => {
                //do validation here
            });
            return _editCommand;
        }
    }

但我不知道如何将ImeAction.Done传递给我的命令,或者我甚至收到类似的东西。

我可以在剩下的部分得到一些帮助吗?

2 个答案:

答案 0 :(得分:1)

您可以创建具有命令的自定义EditText,然后将其绑定到axml中。

另一种选择是使用:

idEditText.OnEditorAction (ImeAction.Done) += (ViewModel as MyViewModel).EditCommand.Execute(whateveryouwanttouse);

要访问您可以使用的活动:

Mvx.Resolve<IMvxAndroidCurrentTopActivity>().Activity

答案 1 :(得分:1)

最后,我在这里使用Stuart答案: https://stackoverflow.com/a/19221385/1188639

我刚刚更改了代码,所以我可以在SubscibeToEvents()中使用我的OnEditorAction并更改句柄功能。全班看起来像这样:

public class MvxEditTextEditForBinding: MvxAndroidTargetBinding
{
    protected EditText EditText
    {
        get { return (EditText)Target; }
    }

    private bool _subscribed;

    public MvxEditTextEditForBinding(EditText view)
        : base(view)
    {
    }

    protected override void SetValueImpl(object target, object value)
    {
        var editText = EditText;
        if (editText == null)
            return;

        value = value ?? string.Empty;
        editText.Text = value.ToString();
    }

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

    public override void SubscribeToEvents()
    {
        var editText = EditText;
        if (editText == null)
            return;

        editText.EditorAction += HandleEditForChange;
        _subscribed = true;
    }

    private void HandleEditForChange(object sender, TextView.EditorActionEventArgs  e)
    {
        var editText = EditText;

        InputMethodManager imm = (InputMethodManager)editText.Context.GetSystemService(Context.InputMethodService); 
        imm.HideSoftInputFromWindow(editText.WindowToken, 0);


        e.Handled = false;
        if (e.ActionId == ImeAction.Done)
        {
            FireValueChanged(editText.Text);
            e.Handled = true;   
        }
    }

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

    protected override void Dispose(bool isDisposing)
    {
        if (isDisposing)
        {
            var editText = EditText;
            if (editText != null && _subscribed)
            {
                editText.EditorAction -= HandleEditForChange;
                _subscribed = false;
            }
        }
        base.Dispose(isDisposing);
    }
}

}