标签内容上的WPF StringFormat


76

我想将字符串绑定的格式设置为绑定到标签的属性Amount is X所在的位置X

我看过很多示例,但以下示例不起作用:

<Label Content="{Binding Path=MaxLevelofInvestment, 
   StringFormat='Amount is {0}'}" />

我也尝试过这些组合:

StringFormat=Amount is {0}
StringFormat='Amount is {}{0}'
StringFormat='Amount is \{0\}'

我甚至试图改变绑定属性的数据类型来intstringdouble。似乎没有任何作用。这是一个非常常见的用例,但似乎不受支持。

Answers:


201

这不起作用的原因是该Label.Content属性是类型的ObjectBinding.StringFormat仅在绑定到一个类型的属性时使用String

发生了什么事:

  1. Binding您的MaxLevelOfInvestmentLabel.Content装箱并将属性存储为装箱的十进制值。
  2. Label控件具有一个包含的模板ContentPresenter
  3. 由于ContentTemplate未设置,因此为该类型ContentPresenter查找DataTemplate定义Decimal。如果找不到,则使用默认模板。
  4. ContentPresenter呈现字符串使用的默认模板通过使用标签的ContentStringFormat属性。

可能有两种解决方案:

  • 使用Label.ContentStringFormat而不是Binding.StringFormat,或者
  • 使用String属性(例如TextBlock.Text)代替Label.Content

这是使用Label.ContentStringFormat的方法:

<Label Content="{Binding Path=MaxLevelofInvestment}" ContentStringFormat="Amount is {0}" />

这是使用TextBlock的方法:

<TextBlock Text="{Binding Path=MaxLevelofInvestment, StringFormat='Amount is {0}'}" />

注意:为简单起见,我在上面的解释中省略了一个细节:ContentPresenter实际使用自身的TemplateStringFormat属性,但是在加载过程中,这些属性会自动模板绑定到的ContentTemplateContentStringFormat属性Label,因此似乎好像ContentPresenter实际上是在使用Label的属性。 。


感谢您的详细解释,现在很有意义。由WPF团队负责,以便为未来做好准备。
一切都很重要2010年

我喜欢您的答案,您知道如何使用2个参数而不是1个吗?在这里确实很挣扎(例如使用触发器等时,TextBlock stringFormat可以处理多个)。
EricG

为什么在这种情况下,您需要将Path =放在绑定的前面?通常我可以做Content="{Binding MaxLevelofInvestment}",而且效果很好...
MistaGoustan

4
为了后代:如果您使用开头一个ContentStringFormat {0},请不要忘记将其放在{}前面。ContentStringFormat="{}{0} some text here"
赶快

7

普及化StringFormatConverter : IValueConverter。将格式字符串传递为ConverterParameter

Label Content="{Binding Amount, Converter={...myConverter}, ConverterParameter='Amount is {0}'"

另外,StringFormatMultiConverter : IMultiValueConverter当您需要多个格式字符串中的对象时,请创建Completed {0} tasks out of {1}


我喜欢这个。我可以看到同时使用纯XAML方法或值转换器的价值。
IAbstract

4

我只是检查了一下,由于某种原因,它不适用于Label,可能是因为它内部使用了ContentPresenter作为Content属性。您可以改用TextBlock,它将起作用。如果您需要继承样式,行为等,也可以将下面的TextBlock摘录放在Label的内容中。

<TextBlock Text="{Binding Path=MaxLevelofInvestment, StringFormat='Amount is \{0\}'} />

1

尝试使用转换器。

<myconverters:MyConverter x:Key="MyConverter"/>


<Label Content="{Binding Path=MaxLevelofInvestment, Converter={StaticResource MyConverter"} />


public class MyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return String.Format("Amount is {0}", value);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value;
    }
}

4
这太过分了。我解释了问题的原因,并在回答中提出了两个简单的解决方案。
雷·伯恩斯

我同意这是隐藏用法,我最近继承了一个采用这种方法的项目,并且更希望开发人员使用StringFormat中的构建而不是自己构建。
Fermin 2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.