Je souhaite formater ma liaison de chaîne en tant que Amount is X
où X
est une propriété liée à une étiquette.
J'ai vu de nombreux exemples, mais ce qui suit ne fonctionne pas:
<Label Content="{Binding Path=MaxLevelofInvestment,
StringFormat='Amount is {0}'}" />
J'ai aussi essayé ces combinaisons:
StringFormat=Amount is {0}
StringFormat='Amount is {}{0}'
StringFormat='Amount is \{0\}'
J'ai même essayé de modifier le type de données de la propriété de liaison en int
, string
et double
. Rien ne semble fonctionner. C’est un cas d’utilisation très courant mais qui ne semble pas être pris en charge.
Cela ne fonctionne pas parce que la propriété Label.Content
est de type Object
et que Binding.StringFormat
n'est utilisé que lors de la liaison à une propriété de type String
.
Ce qui se passe c'est:
Binding
met en boîte votre valeur MaxLevelOfInvestment
et la stocke dans la propriété Label.Content
sous forme de valeur décimale encadrée.ContentPresenter
.ContentTemplate
n'est pas défini, ContentPresenter
recherche un DataTemplate
défini pour le type Decimal
. Lorsqu'il n'en trouve aucun, il utilise un modèle par défaut.ContentPresenter
présente les chaînes en utilisant la propriété ContentStringFormat
de l'étiquette.Deux solutions sont possibles:
Voici comment utiliser Label.ContentStringFormat:
<Label Content="{Binding Path=MaxLevelofInvestment}" ContentStringFormat="Amount is {0}" />
Voici comment utiliser un TextBlock:
<TextBlock Text="{Binding Path=MaxLevelofInvestment, StringFormat='Amount is {0}'}" />
Remarque: par souci de simplicité, j’ai omis un détail dans l’explication ci-dessus: La ContentPresenter
utilise ses propres propriétés Template
et StringFormat
, mais lors du chargement, elles sont automatiquement liées au modèle par la ContentTemplate
et ContentStringFormat
propriétés de la Label
, il semble donc que la ContentPresenter
utilise réellement les propriétés de la Label
.
Je viens de vérifier et pour une raison quelconque, cela ne fonctionne pas avec Label, probablement parce qu'il utilise un ContentPresenter pour la propriété Content en interne. Vous pouvez utiliser un TextBlock à la place et cela fonctionnera. Vous pouvez également insérer l'extrait TextBlock ci-dessous dans le contenu d'une étiquette si vous devez hériter du style, du comportement, etc.
<TextBlock Text="{Binding Path=MaxLevelofInvestment, StringFormat='Amount is \{0\}'} />
Créez un StringFormatConverter : IValueConverter
universel. Passez votre chaîne de format en tant que ConverterParameter
.
Label Content="{Binding Amount, Converter={...myConverter}, ConverterParameter='Amount is {0}'"
Faites aussi StringFormatMultiConverter : IMultiValueConverter
lorsque vous avez besoin de plusieurs objets dans une chaîne de format, par exemple Completed {0} tasks out of {1}
.
Essayez d'utiliser un convertisseur ....
<myconverters:MyConverter x:Key="MyConverter"/>
<Label Content="{Binding Path=MaxLevelofInvestment, Converter={StaticResource MyConverter"} />
public class MyConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return String.Format("Amount is {0}", value);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value;
}
}
Peut-être que ça va aider ...