Использовать шаблон 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 3

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;"
        />