Lier seulement une partie d'une étiquette

Comment atteindre le mélange de valeurs liées avec du texte constant dans un contrôle lié WPF?

Par exemple, disons que j'ai un formulaire affichant les commandes, et je veux une étiquette qui affiche du texte comme "Order ID 1234".

J'ai essayé des choses comme:

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

Est-ce réalisable, ou dois-je faire quelque chose comme avoir plus d'une étiquette, à un contrôle de flux?

24
demandé sur H.B. 2009-03-20 22:02:57

6 réponses

Si vous utilisez 3.5 SP1, vous pouvez utiliser la propriété StringFormat sur la liaison:

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

Sinon, utilisez un convertisseur:

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

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

Ça fera l'affaire.

[Modifier : changez la propriété Text en Content]

23
répondu Inferis 2011-02-17 15:41:44

La Liaison.La propriété StringFormat ne fonctionne pas sur les étiquettes, vous devez utiliser la propriété ContentStringFormat sur L'étiquette.
Par exemple, l'exemple suivant fonctionne:

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

Alors que cet échantillon ne sera pas:

<Label Grid.Row="0" Name="TitleLabel">
        <Label.Content>
            <Binding Path="QuestionnaireName" StringFormat="Thank you for taking the {0} questionnaire"/>
        </Label.Content>            
    </Label>
49
répondu LPCRoy 2009-05-13 17:55:56

Souvent négligé est simplement enchaîner plusieurs textblocks ensemble par exemple

<TextBlock Text="{Binding FirstName}" />
<TextBlock Text=" " />
<TextBlock Text="{Binding LastName}" />
5
répondu bendewey 2009-03-21 03:31:37

Une autre approche consiste à utiliser un seul TextBlock avec plusieurs éléments D'exécution:

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

.. mais pour lier à un élément, vous devez utiliser ajouter une classe bindablerun.

Update mais il y a quelques inconvénients à cette technique ... voir ici

4
répondu Rob Walker 2009-03-22 04:40:01

J'ai trouvé une autre approche. La solution de @Inferis ne fonctionne pas pour moi et celle de @ LPCRoy n'est pas élégante pour moi:

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

C'est mon préféré en ce moment, il semble souple et condensé.

3
répondu Mikołaj 2017-12-08 23:08:51

La réponse de Mikolaj a été modifiée.

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

FallbackValue n'est pas un must.

0
répondu Jogi Joseph George 2018-02-19 14:22:26