通过没有特殊ValueConverter的操作将代码绑定到属性

时间:2015-05-29 13:17:19

标签: mvvmcross

在axml中,我可以像这样绑定

local:MvxBind="Visibility Status==0, Converter=Visibility"

但是当我尝试在代码中执行此操作时:

set.Bind(_imgStatus).For(c => c.Hidden).To(vm => vm.Status == 0).WithConversion("Visibility");

set.Bind(_imgStatus).For(c => c.Hidden).To(vm => vm.Status.Equals(0)).WithConversion("Visibility");

我收到错误 属性表达式必须采用' x =>的形式x.SomeProperty.SomeOtherProperty'或&& 39; x => x.SomeCollection [0] .Property' (System.ArgumentException)

我知道我可以编写自己的ValueConverter,但我很感兴趣是否有超越它的方法,因为显然有一种方法可以在axml中编写它。

1 个答案:

答案 0 :(得分:3)

MvvmCross在流利语法中不包含To(vm => vm.Status == 0)之类的表达式。部分原因是它们难以编码......部分原因是它们的编码通常需要运行时编译(iOS不允许)

解决此问题的唯一方法是在iOS中使用string格式 - 例如比如https://github.com/MvvmCross/NPlus1DaysOfMvvmCross/blob/master/N-35-Tibet/BindMe.Touch/Views/FirstView.cs#L63

所以你的样本可能会变成:

 set.Bind(_imgStatus).For(c => c.Hidden).To("Visibility(Status == 0)");

甚至(在这种情况下):

 set.Bind(_imgStatus).For(c => c.Hidden).To("Status != 0");

还有一些described流畅的方法允许您传入整个绑定字符串 - 例如类似的东西:

 set.Bind(_imgStatus).FullyDescribed("Hidden Visibility(Status != 0)");