首页 > 解决方案 > 如何添加:带有文本值动态绑定的标签?

问题描述

如何在 xamarin.forms 中的 xaml 中添加字符串。我有一个来自应用程序资源文件的文本(i18n:Translate Text=Supplier)。现在有了这段文字,我还添加了:在这段文字之后。我不想在带有文本的应用程序资源中添加 :。我只想在 xaml 上这样做。我尝试使用 StringFormat 但不知道该怎么做。

标签: xamlxamarinxamarin.ios

解决方案


您可以使用值转换器来更改绑定上的值,但这很棘手,因为在使用 i18n:Translate 时无法轻松添加转换器。但我仍然看到您的问题的三种可能解决方案:

1. 没有值转换器的属性

最简单的方法是创建一个获取翻译文本的属性,然后在文本中添加一个冒号:

视图模型:

public string Supplier
{
    get { return AppResources.Supplier + ":"; }
}

XAML:

<Label Text="{Binding Supplier}"/>

2.带有值转换器的属性

另一种方法是创建一个获取翻译文本的属性,然后通过值转换器添加冒号:

视图模型:

public string Supplier
{
    get { return AppResources.Supplier; }
}

转换器类:

public class ColonConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value += ":";
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value.ToString().Remove(value.ToString().Length - 1);
    }
}

XAML:

<ContentPage.Resources>
    <ResourceDictionary>
        <local:ColonConverter x:Key="ColonConverter" />
    </ResourceDictionary>
</ContentPage.Resources>

...

<Label Text={Binding Supplier, Converter={StaticResource ColonConverter}}"/>

3. 创建您自己的翻译扩展和值转换器

我没有对此进行测试,但我发现了这个 SO 答案,它提供了一个关于如何实现这一目标的示例。这样您就不需要向 ViewModel 添加属性,因此您只需在设置翻译扩展和转换器后调整您的 XAML。但是编写自己的翻译扩展需要一些工作。

自定义翻译扩展:

[ContentProperty("Text")]
    public class TranslateExtension : IMarkupExtension
    {
        const string ResourceId = "Project.Resources.AppResources";
        public string Text { get; set; }

        public IValueConverter Converter { get; set; }

        public object ProvideValue(IServiceProvider serviceProvider)
        {
            if (Text == null)
                return null;
            ResourceManager resourceManager = new ResourceManager(ResourceId, typeof(TranslateExtension).GetTypeInfo().Assembly);

            string translatedText = resourceManager.GetString(Text, CultureInfo.CurrentCulture);


        if (this.Converter != null)
        {
            translatedText = Converter.Convert(translatedText, typeof(string), null, CultureInfo.CurrentCulture).ToString() ?? translatedText;
        }

            return translatedText;
        }
    }

XAML:

xmlns:strings="clr-namespace:Project.Utils;assembly=Project"   

<ContentPage.Resources>
    <ResourceDictionary>
        <converters:ColonSpaceConverter x:Key="ColonSpaceConverter" />
    </ResourceDictionary>
</ContentPage.Resources>

<Label Text="{strings:Translate Money, Converter={StaticResource ColonSpaceConverter}}" />

推荐阅读