2016-03-21 75 views
3

我正试图绑定Android中TextView的文本颜色。这里是我的(截)XAML:如何绑定TextView的TextColor?

<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安装一个单独的包?

回答

7

你必须做的唯一的事情,正在安装MvvMCross颜色插件,因为TextColor与它来。它不包含在Core中。您发布的解决方案有效

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

提示:你不必编写特定于平台的ValueConvertes,如果你使用MvxColorValueConverter<ShowCategory>,你可以在不同的平台上共享。

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; 
    } 
} 
+0

我正在使用这个,文本本身现在不可见。我在转换方法中保留了一个断点,它不会在那里出现。 – GvSharma

2

MVVMCross绑定通过绑定到对象的属性来工作,而android:textColor在Android XML中正常工作时,它是对象的基础方法SetTextColor的快捷方式,无法直接绑定到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);} 
    } 
} 
+0

这看起来应该可以工作,但颜色永远不会改变,尽管BindableTextColor的setter按照新颜色值的预期调用。 –

1

感谢您的输入所有 - 最好我会用@斯文迈克尔的跨平台的解决方案,但我最终实现定制Android中结合。

我的代码如下。请注意0​​现在称为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); 
    } 
+2

这是“完全”mvvmcross颜色插件的作用^^ https://github.com/MvvmCross/MvvmCross-Plugins/blob/master/Color/MvvmCross.Plugins.Color.Droid/BindingTargets/MvxDefaultColorBindingSet.cs –

+0

虽然这解决方案确实起作用,我从我的项目中删除了这段代码,并安装了MvvmCross Color插件,该插件也非常完美。谢谢@ Sven-MichaelStübe - 总是从项目中删除不必要的代码:) –

+1

是的,这是理解MvvMCross如何绑定的好习惯。你现在至少可以用可绑定的属性来唤醒自定义视图:) #achivementunlocked –

0

为此,色彩调整及其他用途可以使用下面的代码示例:

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