3

我正在尝试将 a 传递@string/something给值转换器,以便我可以使用它来格式化输出,所以假设我有一个DateTime值,我想将类似的东西传递"Signup Date: {0}"给 ValueConverter。

问题是,上面的文本是可翻译的,所以它来自strings.xml任何给定语言的文件。到目前为止,我试过这个:

<TextView
   local:MvxBind="Text SignupDate, Converter=FriendlyDate, ConverterParameter=@string/release_date"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:ellipsize="end"
   android:maxLines="5"
   android:paddingTop="8dp"
   style="@style/WhiteParagraphText" />

注意ConverterParameter=@string/release_date. 我该怎么做?

4

1 回答 1

2

您可以使用将字符串资源名称作为参数的值转换器执行此操作,在资源中查找其 id 并通过此 id 从资源中获取值。

public class FriendlyDateValueConverter : MvxValueConverter<DateTime, string>
{
    protected override string Convert(DateTime value, Type targetType, object parameter, CultureInfo culture)
    {
        var param = parameter as string;
        if (string.IsNullOrEmpty(param))
        {
            return string.Empty;
        }

        var globals = MvvmCross.Platform.Mvx.Resolve<IMvxAndroidGlobals>();
        var res = globals.ApplicationContext.Resources;
        var id = res.GetIdentifier(param, "string", globals.ApplicationContext.PackageName);
        // id=0, if the resource could not be found -> add some error handling

        var format = res.GetString(id);
        return string.Format(format, value);
    }
}

用法

<TextView 
    local:MvxBind="Text SignupDate, Converter=FriendlyDate, ConverterParameter='release_date'"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ellipsize="end"
    android:maxLines="5"
    android:paddingTop="8dp" />

注意:传递'release_date'而不是@string/release_date作为参数。

于 2016-03-27T12:38:09.913 回答