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

使用MVVM Cross将运行时格式化的XML字符串绑定到Android TextView,android,xml,mvvm,xamarin,mvvmcross,Android,Xml,Mvvm,Xamarin,Mvvmcross,我正在Xamarin Studio中使用MVVM Cross: 我有一个文本视图,我想这样做: <TextView android:id="@+id/title1" android:layout_toRightOf="@+id/thumb1" local:MvxBind="FormattedText Item.Description;" /> 其中Item.Description是在运行时设置的,类似于: "&l

我正在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"
“标题\\n\\n子文本”
或其他格式化字符串

我知道如果使用资源文件,文本字符串是静态的,但我的文本不是静态的,我可以这样做


如果你给我一个可以在Android和iOS XML中工作的解决方案,我会得到额外的分数

这听起来是学习的好时机。 从Wiki:

MvvmCross中的值转换器用于提供到/来自的映射 视图模型中的逻辑值和用户模型中的显示值 接口

在这种情况下,您可以创建一个从
MvxValueConverter
继承的新类,并重写
Convert
方法。您将在
Convert
方法中进行字符串格式化。然后在绑定中可以引用值转换器,MvvmCross将在显示绑定数据之前自动调用值转换器

下面是一个值转换器示例,它将
浮点?
作为输入,并输出格式化的货币
字符串

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);
    }
}
公共类CurrencyValueConverter:MvxValueConverter
{
受保护的重写字符串转换(float?值、类型targetType、对象参数、CultureInfo区域性)
{
return!value.HasValue?null:string.Format(区域性,{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 cross中跨平台工作,但没有Xamarin表单的帮助,则需要使用原始XML和android:layout_toRightOf=“@+id/u-previous_元素的_-id_”以及android:textStyle=“bold”等内容

例如



您不能使用MvxValueConverter在代码中格式化字符串吗?感谢您的回答[Trevor:,这真的很有帮助。对于那些需要在非Xamarin Forms应用程序的C Sharp cross platform中无法进行格式化(如粗体或下划线)的用户,请参阅下面的我的回答。
        <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;"
        />