Encuadernación sólo una parte de una etiqueta
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?
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.