2017-05-16 185 views
0

我正在尝试使用MvvmCross的值转换器更改iOS标签的文本颜色。下面的代码一点点(这是核心项目):Xamarin MvvmCross iOS Bool颜色ValueConverter不更改标签文本颜色

public class BoolToColorValueConverter 
     : MvxValueConverter<bool, object> 
    { 
     protected override object Convert(bool value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      MvxColor mvxColor = null; 
      if(value) 
       mvxColor = new MvxColor(255, 0, 0); 
      else 
       mvxColor = new MvxColor(0, 0, 0); 

      var nativeColorConv = Mvx.Resolve<IMvxNativeColor>(); 

      return nativeColorConv.ToNative(mvxColor); 
     } 
    } 

,然后在我的绑定:

this.CreateBinding(LabelName).For(s => s.TextColor).To((MyViewModel vm) => vm.BooleanPropertyThatChangesAtSomePoint).WithConversion("BoolToColor").Apply(); 

但由于某些原因,当从真到假布尔属性更改,我看到绑定到该属性的其他字段正确更改,但不是标签的文本颜色。

我见过@slodge视频,教程,下载的git示例,但仍无法使其工作。我认为它与转换器没有返回正确的值有关,因为我放置了断点并且转换器已被触发。有任何想法吗?

回答

1

首先,如果该件的代码是在应用中TextColor的唯一引用,则该组件链接过程很可能当LinkerBehaviour设置为Link SDK assemblies onlyLink all assemblies优化掉一些UILabel的属性。如果这是你的项目的情况下,修复程序是要么改变LinkerBehaviourDon't link(不理想),或下面的方法添加到LinkerPleaseInclude

public void Include() 
{ 
    var label = new UILabel 
    { 
     TextColor = UIColor.Black 
    }; 
} 

如果不是唯一的问题,然后你还没有安装Mvx Color Plugin。这样做将会解决您的问题。如果没有,可以考虑重拾你的绑定,如下所示:

var bindingSet = this.CreateBindingSet<MyViewController, MyViewModel >(); 

bindingSet.Bind(LabelName).For(c => c.TextColor).To(vm => vm.TestBoolean).WithConversion(new BoolToColorValueConverter()); 

bindingSet.Apply(); 

附: - 只是一个提示:

颜色插件,您可以访问MvxColorValueConverter,它为您提供了更简洁的方式做你的颜色转换:

public class BoolToColorValueConverter : MvxColorValueConverter 
{ 
    protected override MvxColor Convert(object value, object parameter, CultureInfo culture) 
    { 
     return (bool)value 
      ? new MvxColor(255, 0, 0) 
      : new MvxColor(0, 0, 0); 
    } 
} 
+0

感谢卢克和感谢编辑。我确实安装了MvxColors插件。我不太赞同LinkerPleaseInclude方法。我无法在我的项目中找到该类,因此我认为它必须手动添加。我遵循使用MvxColorValueConverter的方法,但是当应用程序启动时出现错误。我会通过你的建议,并让你知道它是如何去。 – Ph0b0x

+0

实际上使用MvxColor方法取得了诀窍。我错过了IOS项目上的Mvx Color Plugin。我在Core项目中拥有它,但不是在IOS项目中。非常感谢卢克。 – Ph0b0x

+0

使用Mvx插件时的一般经验法则是确保将插件添加到Core和Platform项目中。插件通常具有可移植的界面和特定于平台的实现,因此添加两者可确保其正常工作。 – Kiliman