由于我的用户界面通常需要本地化字符串,因此我的 View 模型提供了 View 使用的所有字符串。这包括按钮上的标题等内容。
在 iOS 端,按钮标题是通过 SetTitle 方法设置的。
为了让 View 模型字符串 => 按钮标题映射工作,MvvmCross 做了一些神奇的绑定(bind)转换来让它很好地工作。
假设我的 View 中有一个名为 Foo 的 UIButton,我想将其标题映射到我的 View 模型中的属性 ButtonLabel。了解以下工作以设置此类绑定(bind):
this.AddBindings(new Dictionary<object, string>() {
{Foo, "Title ButtonTitle"}
});
是否可以使用 MvvmCross 中的 Fluent Binding 系统设置相同的绑定(bind)?我一直在通读 MvvmCross 源代码,但我不太了解绑定(bind)代码。
以下内容不起作用(因为实际上按钮没有 Title 属性 - 它有 SetTitle 方法):
var set = this.CreateBindingSet<FooView, FooViewModel>();
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 和“标题”定义的自定义绑定(bind) - 请参阅:
- https://github.com/slodge/MvvmCross/blob/v3/Cirrious/Cirrious.MvvmCross.Binding.Touch/Target/MvxUIButtonTitleTargetBinding.cs
- 已注册:https://github.com/slodge/MvvmCross/blob/v3/Cirrious/Cirrious.MvvmCross.Binding.Touch/MvxTouchBindingBuilder.cs#L56
因此你应该可以调用:
set.Bind(Foo).For("Title").To(vm => vm.ButtonTitle);
这应该设置与以下相同的绑定(bind):
this.AddBindings(new Dictionary<object, string>() {
{Foo, "Title ButtonTitle"}
});
有关自定义绑定(bind)的简要介绍,请参阅:https://speakerdeck.com/cirrious/custom-bindings-in-mvvmcross
关于c# - Fluent Bindings 和 UIButton 标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16751013/