Fluent Bindings和UIButton标题

由于我的用户界面通常需要具有本地化字符串,因此我的视图模型提供了视图所使用的所有字符串。 这包括按钮上的标题等内容。

在iOS端,按钮标题通过SetTitle方法设置。
为了使视图模型string =>按钮标题映射起作用,MvvmCross做了一些神奇的绑定转换,以使其工作得很好。

假设我的视图中有一个名为Foo的UIButton,我想将其标题映射到View Model中的属性ButtonLabel。 知道以下工作以设置这样的绑定:

this.AddBindings(new Dictionary() { {Foo, "Title ButtonTitle"} }); 

可以使用MvvmCross中的Fluent Binding系统设置相同的绑定吗? 我一直在阅读MvvmCross源代码,但我还没有得到绑定代码。

以下内容不起作用(因为实际上按钮没有Title属性 – 它有一个SetTitle方法):

  var set = this.CreateBindingSet(); set.Bind(Foo).For(b => b.Title).To(vm => vm.ButtonTitle); set.Apply(); 

有没有其他方法可以使用Fluent Bindings获得所需的结果?

因为按钮没有Title属性,所以

 set.Bind(Foo).For(b => b.Title).To(vm => vm.ButtonTitle); 

不会编译。

但是,Xamarin.ios的默认MvvmCross配置具有为UIButton和“Title”定义的自定义绑定 – 请参阅:

因此,您应该可以致电:

 set.Bind(Foo).For("Title").To(vm => vm.ButtonTitle); 

这应该设置相同的绑定:

 this.AddBindings(new Dictionary() { {Foo, "Title ButtonTitle"} }); 

有关自定义绑定的简要介绍,请参阅: https : //speakerdeck.com/cirrious/custom-bindings-in-mvvmcross

在较新版本的MvvmCross 5.x中,存在基于强类型代码的绑定属性。

它们是这样完成的:

 set.Bind(Button).For(v => v.BindTitle()).To(vm => vm. ButtonTitle); 

确保使用以下方法添加:

 using MvvmCross.Binding.iOS; 

可以在此处的文档中找到扩展属性的完整列表, 这是更改所包含的PR。