StringFormat被忽略

时间:2011-06-16 09:32:02

标签: wpf binding string-literals string-formatting


这是我的绑定(缩写,Command-Property也绑定)

<MenuItem Header="Key" CommandParameter="{Binding StringFormat='Key: {0}', Path=PlacementTarget.Tag, RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>

ContectMenu的PlacementTarget的Tag属性是一个类似

的字符串
"Short.Plural"

我希望在Command-Handler中收到的是:

Key: Short.Plural

但我真正得到的是:

Short.Plural

3 个答案:

答案 0 :(得分:32)

Label不使用StringFormat而是使用ContentStringFormat。以这种方式使用它:

<TextBlock x:Name="textBlock" Text="Base Text"/>
<Label Content="{Binding Path=Text, ElementName=textBlock}" ContentStringFormat="FORMATTED {0}"/>

答案 1 :(得分:24)

我很震惊,但我的测试表明StringFormat仅适用于目标d-prop类型为String的情况。我以前从未注意到这一点,也没有听到过它。我现在没有更多的时间来研究它,但这看起来很荒谬。

说真的,这有效:

<TextBlock x:Name="textBlock" Text="Base Text"/>
<TextBlock Text="{Binding StringFormat=FORMATTED {0}, Path=Text, ElementName=textBlock}"/>

这不是:

<TextBlock x:Name="textBlock" Text="Base Text"/>
<Label Content="{Binding StringFormat=FORMATTED {0}, Path=Text, ElementName=textBlock}"/>

由于Label.Content不是String

答案 2 :(得分:0)

使用Binding Converter:

public class CommandParamConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is string)
        {
            return string.Format("Key {0}", value);
        }
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

将其添加到Windows \ UserControl资源:

<Window.Resources>
    <local:CommandParamConverter x:Key="commandParamConverter" />
</Window.Resources>

在菜单CommandParameter绑定中引用它:

<MenuItem Header="Key" CommandParameter="{Binding Converter={StaticResource commandParamConverter}, Path=PlacementTarget.Tag, RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>