MvvmCross:GestureRecognized绑定到ViewModel操作

时间:2013-06-06 11:30:46

标签: iphone ios xamarin mvvmcross uitapgesturerecognizer

可以像这样直接绑定按钮操作:

var set = this.CreateBindingSet<...
set.Bind(button).To(x => x.Go);

但是有关UITapGestureRecognizer的内容,例如。我该如何以这种优雅的方式绑定它(它的点击动作)?

谢谢!

2 个答案:

答案 0 :(得分:17)

如果您愿意,可以自己添加。

e.g。

之类的东西
  public class TapBehaviour
  {
      public ICommand Command { get;set; }

      public TapBehaviour(UIView view)
      {
          var tap = new UITapGestureRecognizer(() => 
          {
              var command = Command;
              if (command != null)
                   command.Execute(null);
          });
          view.AddGestureRecognizer(tap);
      }
  }

  public static class BehaviourExtensions
  {
      public static TapBehaviour Tap(this UIView view)
      {
          return new TapBehaviour(view);
      }
  }

  // binding
  set.Bind(label.Tap()).For(tap => tap.Command).To(x => x.Go);

我认为这样可行 - 但这是在这里编码!


高级&GT;如果您愿意,还可以通过为TapBehaviour注册默认绑定属性来删除For(tap => tap.Command)部分的需要 - 要覆盖Setup.FillBindingNames并使用:

  registry.AddOrOverwrite(typeof (TapBehaviour), "Command");

此后,绑定可能是:

  set.Bind(label.Tap()).To(x => x.Go);

答案 1 :(得分:16)

仅供参考。较新版本的MvvMcross包含一个开箱即用的UIView方法扩展(参见MvxTapGestureRecognizerBehaviour),可用于绑定轻击手势:

using Cirrious.MvvmCross.Binding.Touch.Views.Gestures;

// in this case "Photo" is an MvxImageView
set.Bind(Photo.Tap()).For(tap => tap.Command).To("OpenImage");