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?
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
]
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>
Souvent négligé est simplement enchaîner plusieurs textblocks ensemble par exemple
<TextBlock Text="{Binding FirstName}" />
<TextBlock Text=" " />
<TextBlock Text="{Binding LastName}" />
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
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é.
La réponse de Mikolaj a été modifiée.
<Label Content="{Binding Order.ID}" ContentStringFormat="Order ID {0}" />
FallbackValue n'est pas un must.