标签内容上的 WPF StringFormat

问题描述 投票:0回答:4
wpf wpf-controls binding wpftoolkit wpfdatagrid
4个回答
250
投票

这不起作用的原因是

Label.Content
属性的类型为
Object
,并且
Binding.StringFormat
仅在绑定到
String
类型的属性时使用。

发生的事情是:

  1. Binding
    正在对您的
    MaxLevelOfInvestment
    值进行装箱并将其存储为
    Label.Content
    属性作为装箱的十进制值。
  2. 标签控件有一个包含
    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
实际上使用了自己的
Template
StringFormat
属性,但在加载过程中,它们会自动模板绑定到
ContentTemplate
ContentStringFormat
属性
Label
,所以看起来
ContentPresenter
实际上正在使用
Label
的属性。


6
投票

制作一个通用的

StringFormatConverter : IValueConverter
。将格式字符串传递为
ConverterParameter
.

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

此外,当格式字符串中需要多个对象时,请使用

StringFormatMultiConverter : IMultiValueConverter
,例如
Completed {0} tasks out of {1}


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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.