StringFormat игнорируется - PullRequest
       21

StringFormat игнорируется

20 голосов
/ 16 июня 2011

Это моя привязка (сокращенно, Command-Property также привязана)

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

Свойство Tag объекта PlacementTarget в ContectMenu представляет собой строку типа

"Short.Plural"

Что я ожидаю получить вКомандный обработчик:

Key: Short.Plural

Но то, что я на самом деле получаю:

Short.Plural

Ответы [ 3 ]

33 голосов
/ 15 ноября 2012

Метка не использует StringFormat, но ContentStringFormat. Используйте это так:

<TextBlock x:Name="textBlock" Text="Base Text"/>
<Label Content="{Binding Path=Text, ElementName=textBlock}" ContentStringFormat="FORMATTED {0}"/>
24 голосов
/ 16 июня 2011

Я поражен, но мои тесты просто показывают, что StringFormat применимо, только если целевой d-пропеллер имеет тип 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.

0 голосов
/ 16 июня 2011

используйте 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}}"/>
...