Fra*_*ank 11 c# xamarin.ios mvvmcross
由于我的用户界面通常需要具有本地化字符串,因此我的视图模型提供了视图所使用的所有字符串.这包括按钮上的标题等内容.
在iOS端,按钮标题通过SetTitle方法设置.
为了使视图模型string =>按钮标题映射起作用,MvvmCross会进行一些神奇的绑定转换,以使其正常工作.
假设我的视图中有一个名为Foo的UIButton,我想将其标题映射到View Model中的属性ButtonLabel.知道以下工作以设置这样的绑定:
this.AddBindings(new Dictionary<object, string>() {
{Foo, "Title ButtonTitle"}
});
Run Code Online (Sandbox Code Playgroud)
可以使用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();
Run Code Online (Sandbox Code Playgroud)
有没有其他方法可以使用Fluent Bindings获得所需的结果?
Stu*_*art 27
因为按钮没有Title属性,所以
set.Bind(Foo).For(b => b.Title).To(vm => vm.ButtonTitle);
Run Code Online (Sandbox Code Playgroud)
不会编译.
但是,Xamarin.ios的默认MvvmCross配置具有为UIButton和"Title"定义的自定义绑定 - 请参阅:
因此,您应该可以致电:
set.Bind(Foo).For("Title").To(vm => vm.ButtonTitle);
Run Code Online (Sandbox Code Playgroud)
这应该设置相同的绑定:
this.AddBindings(new Dictionary<object, string>() {
{Foo, "Title ButtonTitle"}
});
Run Code Online (Sandbox Code Playgroud)
有关自定义绑定的简要介绍,请参阅:https://speakerdeck.com/cirrious/custom-bindings-in-mvvmcross
在较新版本的 MvvmCross 5.x 中,存在基于强类型代码的绑定属性。
他们是这样做的:
set.Bind(Button).For(v => v.BindTitle()).To(vm => vm. ButtonTitle);
Run Code Online (Sandbox Code Playgroud)
确保使用以下方法添加:
using MvvmCross.Binding.iOS;
Run Code Online (Sandbox Code Playgroud)
扩展特性的完整列表可以在文档中找到这里并且这是在变动上的去公关。