流畅的绑定和UIButton标题

13

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

在iOS端,按钮标题是通过SetTitle方法设置的。
为了使视图模型字符串=>按钮标题映射正常工作,MvvmCross进行了一些神奇的绑定转换以使其能够良好地运行。

假设我在视图中有一个名为Foo的UIButton,并且我想将其标题映射到我的视图模型中的ButtonLabel属性。我知道以下内容可以用于设置这样的绑定:

this.AddBindings(new Dictionary<object, string>() {
      {Foo, "Title ButtonTitle"}
 });

是否可以使用MvvmCross中的Fluent Binding系统设置相同的绑定?我一直在阅读MvvmCross源代码,但并没有完全理解绑定代码。

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

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

使用Fluent Bindings还有其他实现期望结果的方式吗?

2个回答

27

由于按钮没有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<object, string>() {
  {Foo, "Title ButtonTitle"}
});

如果想要了解自定义绑定的简要介绍,请参阅:https://speakerdeck.com/cirrious/custom-bindings-in-mvvmcross


对于本地化字符串,您可能还需要考虑本地化语言绑定功能 - 请参阅https://speakerdeck.com/cirrious/internationalization-in-mvvmcross和http://slodge.blogspot.co.uk/2013/05/n21-internationalisation-i18n-n1-days.html。 - Stuart
太棒了。你回答了我的问题,还解决了我其他几个问题,而我甚至没有问过。 - Frank Caico
Stuart 也提到:“如果你查看这个链接,你会看到我们如何向系统添加'SpecialProperty'绑定属性和'HitThis'绑定属性。” - Frank Caico

6
在更新的MvvmCross 5.x版本中,使用基于代码的强类型绑定属性。它们的使用方法如下:
set.Bind(Button).For(v => v.BindTitle()).To(vm => vm. ButtonTitle);

请确保使用以下方式添加:

using MvvmCross.Binding.iOS;

您可以在文档这里查看所有扩展属性的完整列表,而此处是更改所在的PR。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接