XAML中具有绑定/函数/格式的StringFormat

本文关键字:函数 格式 StringFormat 绑定 XAML | 更新日期: 2023-09-27 18:16:03

我以前有这个:

xmlns:wpf="clr-namespace:Pol.Wpf;assembly=Pol.Wpf"
Heading="{wpf:Translation Id=5589, Default=Evaluation on, IsUpper=True}"

这很好,给了我一个输出:的"评估">

然后我需要在标题中插入一个日期,格式为:

Heading="{Binding EvaluationDateTime, StringFormat='{} Evaluation on {0:dd-MM-yyyy HH:mm}'}"

这给了我输出:2016年4月12日10:12 评估

很好,但我需要改变使用的"评估">

"{wpf:Translation Id=5589, Default=Evaluation on, IsUpper=True}"

我尝试了很多方法,但都无法将字符串与绑定、字符串格式和翻译函数结合使用。我需要它来处理这样的东西:

Heading="{Binding EvaluationDateTime, StringFormat='{} {wpf:Translation Id=5589, DefaultTranslation=Evaluation on, IsUpper=True} {0:dd-MM-yyyy HH:mm}'}"

XAML中具有绑定/函数/格式的StringFormat

由于我不能确定Pol.Wpf.TranslationExtension类的确切外观以及您是否有能力修改它,我将提出一个更通用的解决方案。

其思想是对TranslationExtension进行子类化,并提供格式化原始扩展产生的值的能力。代码简短明了:

public class FormattedTranslationExtension : TranslationExtension
{
    public string Format { get; set; }
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        var baseValue = base.ProvideValue(serviceProvider)?.ToString();
        if (baseValue != null && Format != null)
            return string.Format(Format, baseValue);
        else
            return baseValue;
    }
}

那么你的绑定会是这样的:

Heading="{Binding EvaluationDateTime,
    StringFormat='{local:FormattedTranslation
        Id=5589,
        DefaultTranslation=Evaluation on,
        IsUpper=True,
        Format='{}{0} {{0:dd-MM-yyyy HH:mm}}'}"

这里的前提是,我们的扩展将生成一个字符串"Evaluation on {0:dd-MM-yyyy HH:mm}"(或翻译后的等效字符串(,以便可以使用它来格式化日期。由于我们自己使用string.Format方法,我们需要通过将{0:dd-MM-yyyy HH:mm}表达式放在一对额外的花括号中来转义它,因此我们有了{{0:dd-MM-yyyy HH:mm}}

如果您有权访问TranslationExtension类,您可以直接将此逻辑放入其中。