Ответ 1
Ярлык не использует StringFormat, а ContentStringFormat. Используйте его следующим образом:
<TextBlock x:Name="textBlock" Text="Base Text"/>
<Label Content="{Binding Path=Text, ElementName=textBlock}" ContentStringFormat="FORMATTED {0}"/>
Это моя привязка (сокращенно, 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
Ярлык не использует StringFormat, а ContentStringFormat. Используйте его следующим образом:
<TextBlock x:Name="textBlock" Text="Base Text"/>
<Label Content="{Binding Path=Text, ElementName=textBlock}" ContentStringFormat="FORMATTED {0}"/>
Я поражен, но мои тесты показывают, что 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
.
использовать конвертер привязки:
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}}"/>