Intereting Posts
Видеофайл Playng присутствует в локальной файловой системе на Android Как установить максимальную ширину для макета Класс Mock для приложений Android с использованием Robolectric в приложении с кинжалом 2 Как я могу получить groupId / GroupName контакта в Android? Добавление входа в приложение в меню настроек Android Зарегистрировать локальный трансляционный приемник в AndroidManifest.xml? Java.exe закончил с ненулевым значением выхода 2 Как получить изображение с веб-сайта url в представлении изображения в android Android-плагин для плагинов multidex ZipException У вас есть #области в Android / eclipse Как проверить, включен ли bluetooth программно? Android gradle build Ошибка «завершена с ненулевым значением выхода 42», что это значит и как я ее исправить? Как найти устройство как LDPI MDPI HDPI или XHDPI Доступность сообщений в Facebook Spinner добавляет строковый массив при выборе элемента, как можно получить связанное с элементом значение в android

Как связать TextColor TextView?

Я пытаюсь связать цвет текста TextView в Android. Вот мой (усеченный) 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. У меня есть аналогичная привязка для фона, который отлично работает. Я видел здесь. В MvvmCross, как мне создать пользовательские свойства связывания , возможно, мне нужно создать пользовательскую привязку, но я не могу найти MvxBaseAndroidTargetBinding . Возможно, мне нужно установить отдельный пакет из nuget?

Единственное, что вам нужно сделать, это установить MvvMCross Color Plugin, потому что 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; } } 

Связывание MVVMCross работает путем привязки к свойствам объекта и в то время как android: textColor отлично работает в Android XML, это ярлык для базового метода объекта SetTextColor, с которым вы не можете напрямую связываться. Что вы можете сделать, так это создать класс, который расширяет TextView и имеет свойство bindable 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);} } } 

Благодарим за ввод всех – в идеале я бы использовал кросс-платформенное решение @ 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); } 

Для этой цели настройка цвета и другие применения могут использовать следующий пример кода:

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