MvvmCross:GestureRecognized 绑定到 ViewModel 动作

Posted

技术标签:

【中文标题】MvvmCross:GestureRecognized 绑定到 ViewModel 动作【英文标题】:MvvmCross: GestureRecognized binding to ViewModel action 【发布时间】:2013-06-06 11:30:46 【问题描述】:

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

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

但是,例如,UITapGestureRecognizer 是什么。我应该如何以如此优雅的方式绑定它(它是点击动作)?

谢谢!

【问题讨论】:

【参考方案1】:

仅供参考。较新版本的 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");

【讨论】:

感谢您的参考。我为滑动添加了一个手势识别器:github.com/MvvmCross/MvvmCross/pull/1266 这是惊人的球。不知道我怎么不知道这些扩展。为我节省了很多绑定到 UIStackview 上的工作。【参考方案2】:

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

例如像

  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);

我认为这会起作用 - 但这是在这里实时编码!


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

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

在此之后,绑定可以是:

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

【讨论】:

非常感谢!尽管有微小的错误输入,但一切都像魅力一样! 已更新。不过,仅更改 4 个字符(由于 *** 限制)是一个技巧。他他 我在 TapBehaviour.Command 的设置器中得到 null 作为值 - 为什么会这样?

以上是关于MvvmCross:GestureRecognized 绑定到 ViewModel 动作的主要内容,如果未能解决你的问题,请参考以下文章

“Raw”Xamarin和MvvmCross

mvvmcross 应用程序单例生命周期

是否有mvvmcross提供的标签式布局平台?

MvvmCross.Forms 5.4:如何设置 UWP 项目?

MvvmCross、Xamarin Studio 和 ICommands

Xamarin.IOS中MvvmCross的plugin使用方式