在我的一个ViewControllers的绑定中,我有以下代码:
BindingSet.Bind(DateSelectBarItem)
.For(v => v.TintColor)
.To(vm => vm.HasDatesSelected)
.WithConversion(new DateFilterButtonStateToTintColourConverter());
DateSelectBarItem
是UIBarButtonItem
。
这是转换器的代码:
public class DateFilterButtonStateToTintColourConverter : MvxValueConverter<bool, UIColor>
{
protected override UIColor Convert(bool value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value ? ColourPalette.Orange : ColourPalette.Blue;
}
}
现在奇怪的是,当我在模拟器上运行它时,我可以看到绑定工作,访问HasDateSelected
属性并且转换器的Convert
方法运行。
然后我部署到设备,它根本不起作用。事实上,当我调试设备时,代码甚至不执行,也没有命中断点。
答案 0 :(得分:2)
这是一个链接问题。通常情况下,在调试模式下模拟器上的某些工作正常,并且在实际设备上不起作用。这可能是因为链接过程剥离了一些代码。
这是因为链接器无法检测何时通过反射使用代码,而MvvmCross依赖于这些代码进行绑定。
为了提示实际使用代码的链接器,MvvmCross包含一个LinkerPleaseInclude.cs
文件,您可以在其中添加其他包含,这些包含使用您希望在其余部分中使用的构造函数,方法和属性。你的代码。
例如,在上述情况中,DateSelectBarItem
有一个属性TintColor
,您在绑定中使用它。在LinkerPleaseInclude.cs
文件中向链接器添加提示的示例如下:
public void Include(BarItem item)
{
item.TintColor = Color.Red;
}
这足以提示链接器保留TintColor
。你可以用构造函数和方法做类似的事情。