Pregunta

¿Cómo se podría lograr mezclando los valores ligados con el texto constante en un control de WPF obligado?

Por ejemplo, decir que tengo una forma de mostrar las órdenes, y quiero una etiqueta que muestra el texto como "ID de orden 1234".

He intentado cosas como:

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

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

¿Fue útil?

Solución

Si está utilizando 3.5 SP1, puede utilizar la propiedad StringFormat sobre la unión:

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

De lo contrario, utilizar un convertidor:

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

Eso va a hacer el truco.

[ Editar : Cambiar el Text propiedad a Content]

Otros consejos

La propiedad Binding.StringFormat no funciona en las etiquetas, es necesario utilizar la propiedad ContentStringFormat en la etiqueta.
Por ejemplo, el siguiente ejemplo funcionará:

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

El mismo tan corto Version:

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

Uso de él para mostrar una unidad después del valor:

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

Si bien esta muestra no podrá:

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

A menudo se pasa por alto es simplemente encadenar múltiples textblocks juntos por ejemplo

<TextBlock Text="{Binding FirstName}" />
<TextBlock Text=" " />
<TextBlock Text="{Binding LastName}" />

Otro enfoque consiste en utilizar un solo TextBlock con múltiples elementos se ejecutan dentro de él:

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

.. pero que se unen a un elemento es necesario utilizar añadir un href="http://fortes.com/2007/03/bindablerun/" rel="nofollow noreferrer"> BindableRun clase

Actualizar , pero hay algunas desventajas a esta técnica ... ver aquí

He encontrado otro enfoque. @ Solución de Inferis no funciona para mí y @ LPCRoy de que no es elegante para mí:

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

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

Modificado respuesta de Mikolaj.

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

FallbackValue no es una necesidad.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top