我正在寻找一种在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中处理命令时看不到这些参数。
答案 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来支持多个平台,或者它是否只是为了机器人。