【问题标题】:How do I bind the TextColor of a TextView?如何绑定 TextView 的 TextColor?
【发布时间】:2017-02-12 03:17:22
【问题描述】:

我正在尝试在 Android 中绑定 TextView 的文本颜色。这是我的(截断的)xaml:

<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:MvxBind=" TextColor CategoryTextColor(Category)"/>

其中 CategoryTextColorValueConverter 如下:

public class CategoryTextColorConverter : MvxValueConverter<ShowCategory, Color>
{
    protected override Color Convert (ShowCategory value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == ShowCategory.AllShows)
        {
            return Color.Blue;
        }
        return Color.Red;
    }
}

转换器被调用并按预期返回颜色,但 TextView 上的文本颜色永远不会改变。我有一个类似的背景颜色绑定,效果很好。我在这里看到In MvvmCross how do I do custom bind properties,也许我需要创建一个自定义绑定,但我找不到MvxBaseAndroidTargetBinding。也许我需要从 nuget 安装一个单独的包?

【问题讨论】:

    标签: android xamarin mvvmcross


    【解决方案1】:

    您唯一需要做的就是安装 MvvMCross Color 插件,因为 TextColor 附带了它。它不包含在核心中。您发布的解决方案有效。

    见:https://github.com/MvvmCross/MvvmCross/wiki/MvvmCross-plugins#color

    提示:您不必编写特定平台的ValueConvertes,如果您使用MvxColorValueConverter&lt;ShowCategory&gt;,则可以跨平台共享。

    public class CategoryTextColorConverter : MvxColorValueConverter<ShowCategory>
    {
        protected override MvxColor Convert(ShowCategory value, object parameter, CultureInfo culture)
        {
            if (value == ShowCategory.AllShows)
            {
                return MvxColors.Blue;
            }
            return MvxColors.Red;
        }
    }
    

    【讨论】:

    • 我正在使用这个,文本本身现在不可见。我在 convert 方法中保留了一个断点,它不会在那里。
    【解决方案2】:

    MVVMCross 绑定通过绑定到对象的属性来工作,而 android:textColor 在 Android XML 中工作正常,它是对象底层方法 SetTextColor 的快捷方式,您无法直接绑定到该方法。您可以做的是创建一个扩展 TextView 并具有可绑定 TextColor 属性的类,然后在您的 Android XML 中使用它并绑定到该属性。例如:

    public class ExtendedTextView : TextView
    {
        public ExtendedTextView(Context context): base (context) { }
        public ExtendedTextView(Context context, IAttributeSet attrs) : base (context, attrs) { }
        public ExtendedTextView(Context context, IAttributeSet attrs, int defStyleAttr) : base(context, attrs, defStyleAttr) { }
        public ExtendedTextView(Context context, IAttributeSet attrs, int defStyleAttr, int defStyleRes) : base (context, attrs, defStyleAttr, defStyleRes) { }
        protected ExtendedTextView(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer) { }
    
        public Color BindableTextColor // property to bind to in XML
        {
            get { return new Color(CurrentTextColor); }
            set { SetTextColor(value);}
        }
    }
    

    【讨论】:

    • 这看起来应该可以工作,但是颜色永远不会改变,尽管 BindableTextColor 的设置器被按预期使用新的颜色值调用。
    【解决方案3】:

    感谢大家的意见 - 理想情况下,我会使用 @sven-michael 的跨平台解决方案,但我最终在 Android 中实现了自定义绑定。

    我的代码如下。请注意,MvxBaseAndroidTargetBinding 现在称为 MvxAndroidTargetBinding

    public class TextColorBinding : MvxAndroidTargetBinding {
    
        private readonly TextView _textView;
    
        public TextColorBinding(TextView textView) : base(textView)
        {
    
            _textView = textView;
        }
    
        public static void Register(IMvxTargetBindingFactoryRegistry registry) {
            registry.RegisterFactory(new MvxCustomBindingFactory<TextView>("TextColor", (textView) => new TextColorBinding(textView)));
        }
    
        #region implemented abstract members of MvxTargetBinding
    
        public override Type TargetType
        {
            get { return typeof(Color); }
        }
    
        #endregion
    
        #region implemented abstract members of MvxConvertingTargetBinding
    
        protected override void SetValueImpl (object target, object value)
        {
            var color = (Color)value;
    
            if (color != null) {
    
                var textView = (TextView)target;
    
                try {
                    textView.SetTextColor (color);
                } catch (Exception ex) {
                    MvxTrace.Error (ex.ToLongString ());
                    throw;
                }
    
            } else {
                MvxBindingTrace.Trace (MvxTraceLevel.Warning, "Value was not a valid Color");
            }
        }
        #endregion
    } 
    

    不要忘记在您的 Setup.cs 中注册绑定,如下所示:

    protected override void FillTargetFactories(MvvmCross.Binding.Bindings.Target.Construction.IMvxTargetBindingFactoryRegistry registry)
        {
            TextColorBinding.Register (registry);
            base.FillTargetFactories(registry);
        }
    

    【讨论】:

    • 这正是 mvvmcross 颜色插件所做的 ^^ github.com/MvvmCross/MvvmCross-Plugins/blob/master/Color/…
    • 虽然这个解决方案确实有效,但我已经从我的项目中删除了这个代码并安装了 MvvmCross Color 插件,它也可以完美运行。谢谢@Sven-MichaelStübe - 从项目中删除不必要的代码总是很高兴:)
    • 是的,了解 MvvMCross 如何绑定是一个很好的做法。您现在至少能够编写具有可绑定属性的自定义视图 :) #achivementunlocked
    【解决方案4】:

    为此,颜色调整等用途可以使用以下代码示例:

    Android.Graphics.Color color = new Android.Graphics.Color(element.CurrentTextColor);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 2012-04-19
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多