mvvmcross touch命令绑定在android中

时间:2012-08-05 11:07:02

标签: mvvm xamarin.android mvvmcross

我正在寻找一种在axml和ViewModel之间进行“触摸”命令绑定的方法,或者其他一些像FocusChanged等。

一个简单的“点击”命令可以正常工作: local:MvxBind =“{'Touch':{'Path':'CameraButtonCommand'}}”/>

    public IMvxCommand CameraButtonCommand
    {
        get
        {
            return new MvxRelayCommand(
                () =>
                {
                    RequestNavigate<AugRealityViewModel>(true);
                })
            ;
        }
    }

但是,我已经为controll尝试了其他事件类型(在这种情况下它是ImageButton)并且它们没有被处理。当我在View Class中检查事件列表时,我会看到:

    public event EventHandler Click;
    public event EventHandler<View.CreateContextMenuEventArgs> ContextMenuCreated;
    public event EventHandler<View.FocusChangeEventArgs> FocusChange;
    public event EventHandler<View.KeyEventArgs> KeyPress;
    public event EventHandler<View.LongClickEventArgs> LongClick;

只有Click事件附加了一般的EventHandler,而其他事件已经发生了EventHandler,我想知道这是否是它无效的原因。

我还试图将一个方法附加到View类中的那些事件,通过FindViewById方法获得适当的控制,这次它按预期工作。但不知怎的,我不能通过命令在axml中做到这一点。

还有一件事。 “Click”事件将“EventArgs”对象作为参数之一发送,也发送对象引用。我可以轻松地看到,如果我在View类中执行此操作,但是当我通过绑定执行此操作时,我在ViewModel中处理命令时看不到这些参数。

1 个答案:

答案 0 :(得分:4)

框架可以自动绑定任何需要EventHandler类型的事件。但是,对于任何需要模板化EventHandler(使用自定义EventArgs)的事件,您都是正确的 - 您需要包含自定义绑定。

好消息是自定义绑定很容易编写和包含。

例如,要绑定:

public event EventHandler<View.LongClickEventArgs> LongClick;

你可以包含以下内容:

public class LongPressEventBinding
    : MvxBaseAndroidTargetBinding
{
    private readonly View _view;
    private IMvxCommand _command;

    public LongPressEventBinding(View view)
    {
        _view = view;
        _view.LongClick += ViewOnLongClick;
    }

    private void ViewOnLongClick(object sender, View.LongClickEventArgs eventArgs)
    {
        if (_command != null)
        {
            _command.Execute();
        }
    }

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

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

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

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

可以使用以下内容在设置中配置:

    protected override void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry)
    {
        base.FillTargetFactories(registry);

        registry.RegisterFactory(new MvxCustomBindingFactory<View>("LongPress", view => new LongPressEventBinding(view)));
    }

请注意,您不能编写绑定到所有不同事件类型的单个类 - 因为编译器要求您为EventArgs包含正确的Type。但是,如果您愿意,可以相当轻松地将public class LongClickEventBinding更改为public class CustomEventBinding<TViewType, TEventArgsType>


关于你应该传递给IMvxCommand Execute方法的参数,我想这有点取决于所讨论的方法,它还取决于你是否需要ViewModel来支持多个平台,或者它是否只是为了机器人。