Использовать шаблон MVVM для связывания XML-строку, отформатированную во время работы в поле TextView Андроид
Я использую MVVM Cross в Xamarin Studio:
У меня есть текстовое представление, и я хочу сделать что-то вроде этого:
<TextView
android:id="@+id/title1"
android:layout_toRightOf="@+id/thumb1"
local:MvxBind="FormattedText Item.Description;"
/>
Где Пункт.Описание устанавливается во время выполнения и равно примерно:
"<b>The header</b>\n\nThe sub text"
Или другая форматированная строка.
Я знаю, что могу сделать это, если текстовая строка статична с помощью файла ресурсов, но мой текст не статичен.
Бонусные очки, если вы дадите мне решение, которое будет работать в Android и iOS XML!
2 ответа:
Похоже, это отличное время, чтобы узнать опреобразователях значений MvvmCross . Из Вики:
Преобразователи значений в MvvmCross используются для обеспечения отображения в/из логические значения в моделях представления и представленные значения в пользователе взаимодействие.
В этом случае можно создать новый класс, унаследованный от
MvxValueConverter
, и переопределить методConvert
. Вы будете выполнять форматирование строк внутри методаConvert
. Тогда в вашей привязке вы можете ссылаться на значение Конвертер и MvvmCross автоматически вызовут преобразователь значений, прежде чем он отобразит связанные данные.Вот пример преобразователя значений, который принимает
float?
в качестве входа и выводит форматированную валютуstring
:public class CurrencyValueConverter : MvxValueConverter<float?, string> { protected override string Convert(float? value, Type targetType, object parameter, CultureInfo culture) { return !value.HasValue ? null : string.Format(culture, "{0:C}", value.Value); } }
Тогда внутри AXML вы можете ссылаться на преобразователь значений, используя следующий синтаксис:
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="8dp" android:text="[CashOnDeliveryCharges]" local:MvxBind="Text Currency(CashOnDeliveryCharges), FallbackValue='N/A'" />
Для тех из вас, кому требуется простое форматирование, например добавление тире к телефонным номерам и т. д., см. превосходный и информативный ответ Тревора выше.
Если вам нужны такие вещи, как жирный шрифт, подчеркивание и т. д., И вы работаете кросс-платформенный в MVVM крест, но без помощи в Xamarin форм, вам потребуется использовать необработанные данные в формате XML и Android:layout_toRightOf="@+ID и/the_id_of_the_previous_element" в сочетание с вещами как Android:textStyle="полужирный"
Например
<TextView android:id="@+id/id1" android:textStyle="bold" local:MvxBind="Text YourPropertyToBind;" /> <TextView android:id="@+id/id2" android:layout_toRightOf="@+id/id1" android:text="the_second_bit_of_text_this_is_static_not_bound_if_you_want" /> <TextView android:id="@+id/id3" android:layout_toRightOf="@+id/id2" android:textStyle="bold" local:MvxBind="Text The_Next_Bit_Of_Text;" />