C# XAML中带绑定/函数/格式的StringFormat

C# XAML中带绑定/函数/格式的StringFormat,c#,wpf,xaml,string.format,C#,Wpf,Xaml,String.format,我曾经有过这样的经历: 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 {

我曾经有过这样的经历:

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评估

很好,但我需要改变我的想法 “评估”使用

我尝试了很多方法,但就是无法让我的字符串与绑定、stringformat和translate函数结合使用。 我需要它来处理这样的事情:

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

由于我无法确定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='{} {wpf:Translation Id=5589, DefaultTranslation=Evaluation on, IsUpper=True} {0:dd-MM-yyyy HH:mm}'}"
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-yyy-HH:MM}”
(或翻译后的等效值),以便可以使用它格式化日期。由于我们自己使用
string.Format
方法,我们需要通过将
{0:dd-MM-yyyy-HH:MM}
表达式放在一对额外的花括号中来转义它,因此我们有
{0:dd-MM-yyy-HH:MM}


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

由于我无法确定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='{} {wpf:Translation Id=5589, DefaultTranslation=Evaluation on, IsUpper=True} {0:dd-MM-yyyy HH:mm}'}"
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-yyy-HH:MM}”
(或翻译后的等效值),以便可以使用它格式化日期。由于我们自己使用
string.Format
方法,我们需要通过将
{0:dd-MM-yyyy-HH:MM}
表达式放在一对额外的花括号中来转义它,因此我们有
{0:dd-MM-yyy-HH:MM}


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

这不应该在视图模型中吗?如果必须在XAML中,我建议您将标题设置为一个
TextBlock
,它有两个单独的运行-第一个是“对”文本的评估,下一个是使用
StringFormat
绑定到日期。如果必须在viewmodel中执行此操作,我将不得不在集合中循环以添加属性,因为我不允许更改集合来自的模型。而且“Heading”是一个自定义usercontrol上的依赖属性,该自定义usercontrol类型为string。我确实试过了,在它里面我试过了,但它抱怨说它没有被识别为类型字符串。什么是
翻译
?这是XAML标记扩展吗?不应该在视图模型中吗?如果必须在XAML中,我建议您将标题设置为一个
TextBlock
,它有两个单独的运行-第一个是“对”文本的评估,下一个是使用
StringFormat
绑定到日期。如果必须在viewmodel中执行此操作,我将不得不在集合中循环以添加属性,因为我不允许更改集合来自的模型。而且“Heading”是一个自定义usercontrol上的依赖属性,该自定义usercontrol类型为string。我确实试过了,在它里面我试过了,但它抱怨说它没有被识别为类型字符串。什么是
翻译
?这是XAML标记扩展吗?