使用 MVVM Cross 将在 运行 时间格式化的 XML 字符串绑定到 Android TextView

Use MVVM Cross to bind an XML string formatted at run time to an Android TextView

我在 Xamarin Studio 中使用 MVVM Cross:

我有一个文本视图,我想做这样的事情:

<TextView
        android:id="@+id/title1"
        android:layout_toRightOf="@+id/thumb1"
        local:MvxBind="FormattedText Item.Description;"
         />

其中 Item.Description 在运行时设置,等于:

"<b>The header</b>\n\nThe sub text"

或其他格式化字符串。

我知道如果文本字符串是静态的,我可以使用资源文件执行此操作,但我的文本不是静态的。

如果你给我一个适用于 Android 和 iOS XML!

的解决方案,我将加分

这听起来是了解 MvvmCross Value Converters 的好时机。 来自维基:

Value Converters in MvvmCross are used to provide mappings to/from logical values in the view models and presented values in the user interface.

在这种情况下,您可以创建一个新的 class 继承自 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'" />

对于那些需要简单格式设置(例如向 phone 数字添加破折号等)的人,请参阅上面 Trevor 出色且信息丰富的回答。

如果您需要粗体、下划线等内容,并且您在 MVVM Cross 中跨平台工作但没有 Xamarin 表单的帮助,则需要使用原始 XML 和 android:layout_toRightOf="@+id/the_id_of_the_previous_element" 结合 android:textStyle="bold"

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