android中的mvvmcross-touch命令绑定

android中的mvvmcross-touch命令绑定,mvvm,xamarin.android,mvvmcross,Mvvm,Xamarin.android,Mvvmcross,我正在寻找一种方法来在axml和ViewModel之间或其他类似FocusChanged等之间进行“Touch”命令绑定 一个简单的“单击”命令可以很好地工作,如下所示: 本地:MvxBind=“{'Touch':{'Path':'CameraButtonCommand'}}”/> public imvx命令CameraButtonCommand { 得到 { 返回新的MvxRelayCommand( () => { 请求导航(true); }) ; } } 但是,我已经尝试了控件的其他事件类

我正在寻找一种方法来在axml和ViewModel之间或其他类似FocusChanged等之间进行“Touch”命令绑定

一个简单的“单击”命令可以很好地工作,如下所示: 本地:MvxBind=“{'Touch':{'Path':'CameraButtonCommand'}}”/>

public imvx命令CameraButtonCommand
{
得到
{
返回新的MvxRelayCommand(
() =>
{
请求导航(true);
})
;
}
}
但是,我已经尝试了控件的其他事件类型(在本例中是ImageButton),但它们没有被处理。在查看类中的事件列表后,我看到:

    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;
公共事件事件处理程序单击;
已创建公共事件事件处理程序ContextMenuCreated;
公共事件处理程序FocusChange;
公共事件处理程序按键;
公共事件事件处理程序LongClick;
只有单击事件才会附加常规EventHandler,而其他事件则附加了常规EventHandler,我想知道这是否就是它不起作用的原因

我还尝试将一个方法附加到视图类中的那些事件上,通过FindViewById方法获得适当的控制,这次效果与预期一样。但不知何故,我无法通过命令在axml中实现这一点


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

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

好消息是定制绑定很容易编写和包含

例如,要绑定:

公共事件事件处理程序长按;
您可以包括以下内容:

公共类LongPressEventBinding
:MvxBaseAndroidTargetBinding
{
私有只读视图_视图;
专用IMvxCommand\u命令;
公共LongPressEventBinding(视图)
{
_视图=视图;
_view.LongClick+=查看onlongclick;
}
private void ViewOnlonLongClick(对象发送者,View.LongClickEventArgs-eventArgs)
{
如果(_命令!=null)
{
_command.Execute();
}
}
公共覆盖无效设置值(对象值)
{
_命令=(IMvxCommand)值;
}
受保护的覆盖无效处置(bool isDisposing)
{
if(isDisposing)
{
_view.Click-=ViewOnLongClick;
}
基础处理(isDisposing);
}
公共覆盖类型TargetType
{
获取{return typeof(IMvxCommand);}
}
公共覆盖MvxBindingMode默认模式
{
获取{return MvxBindingMode.OneWay;}
}
}
可在安装程序中使用以下方式配置:

受保护的覆盖无效FillTargetFactorys(IMvxTargetBindingFactoryRegistry注册表)
{
base.FillTargetFactorys(注册表);
RegisterFactory(新的MvxCustomBindingFactory(“LongPress”,view=>new LongPressEventBinding(view));
}

请注意,您不能编写一个绑定到所有不同事件类型的类,因为编译器要求您为EventArgs包含正确的类型。但是,如果愿意,您可以相当轻松地将
公共类LongClickEventBinding
更改为类似于
公共类CustomEventBinding
的内容



关于应该传递给IMvxCommand Execute方法的参数,我想这在一定程度上取决于所讨论的方法,也取决于是否需要ViewModel来支持多个平台,或者它是否仅适用于Android。

这在MvvmCross 3中仍然有效吗?我做了-我尝试了这段代码,但是由于某些原因,MvxBaseAndroidTargetBinding无法解析。N=28的代码是-可以通过中N=28的链接找到,因此该代码与本例不同。在这个答案的示例中,您使用了MvxBaseAndroidTargetBinding,但是在N=28示例中不存在。相反,它使用MvxAndroidTargetBinding(无基)-因此我假设自本例以来,API实际上已经发生了更改?只想添加一个小警告。在编写自定义绑定时,始终使用弱订阅,而不是使用+=订阅。例如:var disposable=view.WeakSubscribe(nameof(view.LongClick)、ViewOnLongClick);
    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;