【问题标题】:Xamarin MvvmCross iOS Bool to Color ValueConverter not changing Label Text ColorXamarin MvvmCross iOS Bool to Color ValueConverter 不改变标签文本颜色
【发布时间】:2017-10-15 18:35:29
【问题描述】:

我正在尝试使用带有 MvvmCross 的值转换器更改 iOS 标签的文本颜色。这是代码的一点点(在Core项目中):

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();

但由于某种原因,当布尔属性从 true 更改为 false 时,我看到绑定到该属性的其他字段正确更改,但标签的文本颜色没有。

我看过@slodge 视频、教程、下载的 git 示例,但仍然无法使其正常工作。我认为这与转换器没有返回正确的值有关,因为我设置了断点并触发了转换器。有什么想法吗?

【问题讨论】:

    标签: c# ios xamarin mvvmcross


    【解决方案1】:

    首先,如果那段代码是您的应用程序中对 TextColor 的唯一引用,那么当 LinkerBehaviour 设置为 Link SDK assemblies onlyLink all assemblies。如果您的项目是这种情况,解决方法是将LinkerBehaviour 更改为Don'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);
        }
    }
    

    【讨论】:

    • 感谢 Luke 并感谢您的编辑。我确实安装了 MvxColors 插件。我不太明白 LinkerPleaseInclude 方法。我在我的项目中找不到那个类,所以我认为它必须手动添加。我使用 MvxColorValueConverter 遵循了您的方法,但是在应用程序启动时出现错误。我会遵循您的建议,让您知道进展如何。
    • 实际上使用 MvxColor 方法成功了。我在 IOS 项目中缺少 Mvx 颜色插件。我在核心项目中有它,但在 IOS 项目中没有。非常感谢卢克。
    • 使用 Mvx 插件时的一般经验法则是确保将插件添加到核心和平台项目中。插件通常具有可移植的接口和特定于平台的实现,因此添加两者可确保其正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    相关资源
    最近更新 更多