Mvvmcross Bind Click仅在焦点后触发

时间:2017-03-07 13:54:16

标签: android xamarin mvvmcross

    <CC.CustomEditText
        android:id="@+id/receptionIdentityArticle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:theme="@style/ExtendProTheme"
        android:maxLength="20"
        style="@style/ExtendProTheme.EditText"
        android:layout_below="@+id/suppliersSearchInputLabel"
        local:MvxBind=" Text ArticleSearchClause, Mode=TwoWay; EnterCommand SearchArticlesCommand; Error Errors['ArticleSearchClause']; Click OnSearchClickCommand" />

所以我有一个与EditText不同的CustomEdit通过覆盖两个事件

    this.KeyPress += OnEnterKeyPressed;
    this.FocusChange += OnFocusChange;

我的问题是我第二次单击EditText时会触发Click命令。第一次它只是聚焦然后我点击它第二次Click命令触发。我想它应该如何工作,但我想抓住它在EditText上完成的第一次点击。另一个事件可能是它被触发但我找不到一个包含EditText所有可能绑定的文档。任何想法我如何能够第一次点击EditText?

2 个答案:

答案 0 :(得分:2)

您可以使用Touch事件代替Click来使第一次点击时触发事件。不幸的是,你所描述的行为对于Android是正常的(尽管令人困惑)并且与MVVMCross无关。

答案 1 :(得分:1)

正如@hankide所说,请改用Touch事件。您需要创建自定义绑定。我碰巧刚刚处理过这个问题,所以这就是:

public class MvxViewTouchBinding
    : MvxAndroidTargetBinding
{
    private readonly View _view;
    private IMvxCommand _command;

    public MvxViewTouchBinding(View view) : base(view)
    {
        _view = view;
        _view.Touch += ViewOnTouch;
    }

    private void ViewOnTouch(object sender, View.TouchEventArgs eventArgs)
    {
        eventArgs.Handled = false;

        if (_command != null)
        {
            _command.Execute();
        }
    }

    public override void SetValue(object value)
    {
        _command = (IMvxCommand)value;
    }

    protected override void Dispose(bool isDisposing)
    {
        if (isDisposing)
        {
            _view.Touch -= ViewOnTouch;
        }
        base.Dispose(isDisposing);
    }

    protected override void SetValueImpl(object target, object value)
    {
    }

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

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

并在您的Setup.cs中添加

    protected override void FillTargetFactories(MvvmCross.Binding.Bindings.Target.Construction.IMvxTargetBindingFactoryRegistry registry)
    {
        base.FillTargetFactories(registry);
        registry.RegisterCustomBindingFactory<View>("Touch",
                                                  view => new MvxViewTouchBinding(view));
    }

然后您可以绑定到Touch而不是Click。