Pergunta

Como se poderia conseguir misturar valores vinculados com o texto constante em um WPF controle ligado?

Por exemplo, digamos que eu tenho um formulário exibindo ordens, e eu quero um rótulo que exibe o texto como "Order ID 1234".

Eu tentei coisas como:

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

É este possível, ou eu tenho que fazer alguma coisa como ter mais de um rótulo em um controle de fluxo?

Foi útil?

Solução

Se você estiver usando 3.5 SP1, você pode usar a propriedade StringFormat na ligação:

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

Caso contrário, use um conversor:

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

Com StringFormatConverter ser um 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();
    }

Isso vai fazer o truque.

[ Editar : Altere a propriedade Text para Content]

Outras dicas

A propriedade Binding.StringFormat não funciona em etiquetas, você precisa usar a propriedade ContentStringFormat na etiqueta.
Por exemplo, o seguinte exemplo funcionará:

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

O mesmo tão curto Versão:

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

Usando-a para exibir uma unidade após o valor:

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

Embora esta amostra não irá:

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

Muitas vezes esquecido é simplesmente encadeando vários TextBlocks em conjunto, por exemplo,

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

Outra abordagem é usar um único TextBlock com vários elementos executado dentro dele:

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

.. mas para vincular a um elemento que você precisa usar adicionar um href="http://fortes.com/2007/03/bindablerun/" rel="nofollow noreferrer"> BindableRun classe .

Atualizar Mas há algumas desvantagens para esta técnica ... ver aqui

Eu encontrei uma outra abordagem. @ Solução de Inferis não funciona para mim e @ LPCRoy de não é elegante para mim:

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

É o meu favorito neste momento, ele é parece flexível e condensado.

Modified resposta de Mikolaj.

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

FallbackValue não é uma obrigação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top