标签内容上的WPF StringFormat

时间:2010-11-17 16:23:42

标签: wpf wpf-controls binding wpftoolkit wpfdatagrid

我想将我的字符串绑定格式化为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。似乎没什么用。这是一个非常常见的用例,但似乎不受支持。

6 个答案:

答案 0 :(得分:169)

这不起作用的原因是Label.Content属性的类型为Object,而Binding.StringFormat仅在绑定到String类型的属性时使用。

发生的事情是:

  1. Binding正在装箱您的MaxLevelOfInvestment值并将Label.Content属性存储为盒装小数值。
  2. Label控件的模板包含ContentPresenter
  3. 由于未设置ContentTemplateContentPresenter会查找为DataTemplate类型定义的Decimal。当它找不到时,它使用默认模板。
  4. ContentPresenter使用的默认模板使用标签的ContentStringFormat属性显示字符串。
  5. 可能有两种解决方案:

    • 使用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属性,但在加载过程中,它们会自动模板绑定到ContentTemplate的{​​{1}}和ContentStringFormat属性,似乎Label实际上正在使用ContentPresenter的属性。

答案 1 :(得分:5)

制作通用StringFormatConverter : IValueConverter。将格式字符串传递为ConverterParameter

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

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

答案 2 :(得分:3)

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

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

答案 3 :(得分: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 :(得分:1)

也许这会有所帮助......

Embed code in XAML

答案 5 :(得分:0)

你可以在下面使用这个

<Label Text="{Binding Content, StringFormat='Page Data> {0}'}" />

"Content" 是绑定变量,在单引号之间键入您的文本。 {0} 将插入内容数据的位置。