2011-06-16 9 views
19


Esta es vinculante (abreviado, Comando + alojamiento se encuentra obligado) miStringFormat se ignora

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

El Tag-Propiedad de PlacementTarget de ContectMenu es una cadena como

"Short.Plural" 

lo que espero para recibir en el Manejador de Comando es:

Key: Short.Plural 

Pero lo que tengo aliado recibe es:

Short.Plural 
+0

¿Está enviando este valor al comando Parámetro? –

Respuesta

32

etiqueta no utiliza StringFormat pero ContentStringFormat. Úselo de esta manera:

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

Esta es la respuesta correcta. :) – Philip

+5

Esto debe marcarse como la respuesta. También para un MenuItem para formatear el encabezado es HeaderStringFormat – Viv

23

Estoy asombrado, pero mis pruebas muestran que solo StringFormat sólo se aplica si el objetivo d-prop es de tipo String. Nunca antes lo había notado, ni lo había escuchado mencionar. No tengo más tiempo para analizarlo ahora, pero parece ridículo.

serio, esto funciona:

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

Esto no es así:

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

Desde Label.Content no es un String.

+0

Pero el parámetro de comando no parece reconocer el formato de cadena o al menos no sabe cómo usarlo, por lo que solo devuelve el valor que está en el enlace y no el resultado del formato de cadena. – kevindaub

0

uso del convertidor Encuadernación:

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(); 
    } 
} 

Añadir a recursos de Windows \ UserControl:

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

remitirla en el menú CommandParameter vinculante:

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

Ok, esta parece ser la única solución en este momento ... Voy a usar un convertidor, pero con un ConvertidorParameter => "StringConcatenationConverter" – Reini

+1

La respuesta de @tabina es más adecuada para esto ya que no solo elimina el requisito para un convertidor adicional, pero también tiene la ventaja de aplicar la localización más fácil – Viv