Подтвердить что ты не робот

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


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

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

Тег-свойство объекта ContectMenu PlacementTarget является строкой типа

"Short.Plural"

То, что я ожидаю получить в Command-Handler, это:

Key: Short.Plural

Но я получаю следующее:

Short.Plural
4b9b3361

Ответ 1

Ярлык не использует StringFormat, а ContentStringFormat. Используйте его следующим образом:

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

Ответ 2

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

Ответ 3

использовать конвертер привязки:

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}}"/>