¿Cómo se podía lograr la mezcla de valores vinculados con la constante de texto en WPF control enlazado?

Por ejemplo, decir que tengo una forma de mostrar los pedidos, y quiero una etiqueta que muestra el texto como «el Fin de ID 1234».

He probado cosas como:

text="Order ID {Binding ....}"

Es este alcanzable, o tengo que hacer algo como tener más de una etiqueta en un control de flujo?

6 Comentarios

  1. 23

    Si usted está usando 3.5 SP1, puede utilizar el StringFormat de la propiedad en el enlace:

    <Label Content="{Binding Order.ID, StringFormat=Order ID \{0\}}"/>

    De lo contrario, utilice un convertidor de:

    <local:StringFormatConverter x:Key="StringFormatter" StringFormat="Order ID {0}" />
    <Label Content="{Binding Order.ID, Converter=StringFormatter}"/>

    Con StringFormatConverter ser un IValueConverter:

    [ValueConversion(typeof(object), typeof(string))]
    public class StringFormatConverter : IValueConverter
    {
        public string StringFormat { get; set; }
    
        public object Convert(object value, Type targetType,
                              object parameter, CultureInfo culture) {
             if (string.IsNullOrEmpty(StringFormat)) return "";
             return string.Format(StringFormat, value);
        }
    
    
        public object ConvertBack(object value, Type targetType,
                                  object parameter, CultureInfo culture)
        {
            throw new NotSupportedException();
        }

    Que va a hacer el truco.

    [Editar : Cambiar el Text propiedad Content]

    • Con el stringformat ejemplo, ¿qué sucede si la cadena de caracteres debe contener una coma? ¿Entonces no tienen más remedio que ir con el convertidor opción?
    • AFAIK la etiqueta de control no tiene la Text de la propiedad. Se debe vincular la Content propiedad
  2. 51

    La Unión.StringFormat propiedad no funciona en las Etiquetas, es necesario utilizar el ContentStringFormat de la propiedad en la Etiqueta.

    Por ejemplo, en el siguiente ejemplo va a trabajar:

    <Label>
        <Label.Content>
            <Binding Path="QuestionnaireName"/>
        </Label.Content>
        <Label.ContentStringFormat>
            Thank you for taking the {0} questionnaire
        </Label.ContentStringFormat>
    </Label> 

    El mismo como la Versión corta:

    <Label Content="{Binding QuestionnaireName}" ContentStringFormat="Thank you for taking the {0} questionnaire" />

    Utilizar para la visualización de una unidad después de que el valor de:

    <Label Content="{Binding Temperature}" ContentStringFormat="{}{0}°C" />

    Mientras que este ejemplo no:

    <Label>
        <Label.Content>
            <Binding Path="QuestionnaireName" StringFormat="Thank you for taking the {0} questionnaire"/>
        </Label.Content>            
    </Label>
    • Suspiro. Otra restricción arbitraria impuesta por WPF los desarrolladores.
    • Alguna idea de por qué la Unión.StringFormat no funciona?
    • Desde Label.Content es de tipo Object, la unión no ve la necesidad de convertir y el formato al valor como una cadena.
    • Esta es realmente la respuesta a la pregunta.
  3. 5

    A menudo se pasa por alto es simplemente el encadenamiento de varios bloques de texto juntos por ejemplo

    <TextBlock Text="{Binding FirstName}" />
    <TextBlock Text=" " />
    <TextBlock Text="{Binding LastName}" />
    • Esto se mostrará en 3 líneas separadas.
    • esto depende de qué tipo de stackpanel es en
  4. 4

    Otro enfoque es el uso de un único Bloque con múltiples Ejecutar elementos dentro de ella:

    <TextBlock><Run>Hello</Run><Run>World</Run></TextBlock>

    .. pero que se unen a un elemento que necesita para utilizar agregar un BindableRun clase.

    Actualización Pero hay algunas desventajas a esta técnica … ver aquí

    • Esta es la opción si quieres también un formato diferente (número en negrita f.e.)
  5. 3

    Me encontré con otro enfoque. @Inferis la solución no funciona para mí y @LPCRoy no elegante para mí:

    <Label Content="{Binding Path=Order.ID, FallbackValue=Placeholder}" ContentStringFormat="Order ID {0}">

    Es mi favorita en este momento, no parece flexible y condensada.

  6. 0

    Modificado Mikolaj la respuesta.

    <Label Content="{Binding Order.ID}" ContentStringFormat="Order ID {0}" />

    FallbackValue no es una necesidad.

Dejar respuesta

Please enter your comment!
Please enter your name here