<MenuItem Header="Key" CommandParameter="{Binding StringFormat='Key: {0}', Path=PlacementTarget.Tag, RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>
The Tag-Property of ContectMenu's PlacementTarget is a String like
"Short.Plural"
What i expect to receive in the Command-Handler is:
Key: Short.Plural
But what i acutally receive is:
Short.Plural
Label does not use StringFormat but ContentStringFormat. Use it this way:
<TextBlock x:Name="textBlock" Text="Base Text"/>
<Label Content="{Binding Path=Text, ElementName=textBlock}" ContentStringFormat="FORMATTED {0}"/>
I'm astounded, but my tests just show that StringFormat
only applies if the target d-prop is of type String
. I've never noticed this before, nor heard it mentioned. I don't have more time to look into it right now, but this seems ridiculous.
Seriously, this works:
<TextBlock x:Name="textBlock" Text="Base Text"/>
<TextBlock Text="{Binding StringFormat=FORMATTED {0}, Path=Text, ElementName=textBlock}"/>
This does not:
<TextBlock x:Name="textBlock" Text="Base Text"/>
<Label Content="{Binding StringFormat=FORMATTED {0}, Path=Text, ElementName=textBlock}"/>
Since Label.Content
is not a String
.
use 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();
}
}
Add it to Windows\UserControl resource:
<Window.Resources>
<local:CommandParamConverter x:Key="commandParamConverter" />
</Window.Resources>
Refer it in Menu CommandParameter binding:
<MenuItem Header="Key" CommandParameter="{Binding Converter={StaticResource commandParamConverter}, Path=PlacementTarget.Tag, RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>
精彩评论