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 实现所需的结果?

4

2 回答 2

27

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

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

不会编译。

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

因此,您应该能够调用:

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

于 2013-05-25T15:28:46.217 回答
6

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

它们是这样完成的:

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

确保使用以下方法添加:

using MvvmCross.Binding.iOS;

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

于 2017-09-27T10:53:14.197 回答