Intereting Posts
Изменение настроек настройки виджета Android после создания? Android: в биллинге приложений, используя библиотеку или нет? ActionBarSherlock 4.0 не работает. Но 3.5.1 сделать Изменение высоты относительной компоновки с той же скоростью, что и пользователь. Finger Moves on Layout Android Framework? Как сохранить зарегистрированное пользовательское состояние в facebook sdk 4.4.0 android Коды OpenGL соответствуют координатам экрана? Что мы используем для конфигурации сетевой безопасности Android N для самоподписанного сертификата? Как установить все приложения на Android-телефоне Создание макета входа, как в приложении facebook для Android Bluetooth не отправляет файл на другое устройство Как определить правильную ориентацию устройства в многоэкранном режиме Android N? Android – Анимируйте верхний вид ViewMargin / bottomMargin / etc в LinearLayout или RelativeLayout Как показать диалог прогресса в Android? Веб-сайт MVC, вызывающий WCF, лучше или напрямую работает с базой данных MVC

Как связать 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);