Der Grund, warum dies nicht funktioniert, ist, dass die Label.Content
Eigenschaft vom Typ Object
ist und Binding.StringFormat
nur beim Binden an eine Eigenschaft vom Typ verwendet wird String
.
Was passiert ist:
- Das
Binding
boxt Ihren MaxLevelOfInvestment
Wert und speichert die Label.Content
Eigenschaft als dezimalen Boxwert.
- Das Label-Steuerelement verfügt über eine Vorlage, die a enthält
ContentPresenter
.
- Da
ContentTemplate
nicht gesetzt ist, ContentPresenter
sucht nach einem DataTemplate
für den Decimal
Typ definierten . Wenn keine gefunden wird, wird eine Standardvorlage verwendet.
- Die Standardvorlage, die von den
ContentPresenter
Present-Zeichenfolgen mithilfe der ContentStringFormat
Eigenschaft des Labels verwendet wird .
Zwei Lösungen sind möglich:
- Verwenden Sie Label.ContentStringFormat anstelle von Binding.StringFormat oder
- Verwenden Sie eine String-Eigenschaft wie TextBlock.Text anstelle von Label.Content
So verwenden Sie Label.ContentStringFormat:
<Label Content="{Binding Path=MaxLevelofInvestment}" ContentStringFormat="Amount is {0}" />
So verwenden Sie einen TextBlock:
<TextBlock Text="{Binding Path=MaxLevelofInvestment, StringFormat='Amount is {0}'}" />
Hinweis: Der Einfachheit halber habe ich in der obigen Erklärung ein Detail weggelassen: Das verwendet ContentPresenter
tatsächlich seine eigenen Template
und StringFormat
Eigenschaften, aber während des Ladens werden diese automatisch an die ContentTemplate
und ContentStringFormat
Eigenschaften des und gebunden Label
, sodass es so aussieht, als ob das ContentPresenter
tatsächlich die Label
Eigenschaften des verwendet .
Content="{Binding MaxLevelofInvestment}"
es einfach tun und es funktioniert{0}
, vergessen Sie nicht, es{}
davor zu setzen . Also mach esContentStringFormat="{}{0} some text here"
Machen Sie eine universelle
StringFormatConverter : IValueConverter
. Übergeben Sie Ihre Formatzeichenfolge alsConverterParameter
.Label Content="{Binding Amount, Converter={...myConverter}, ConverterParameter='Amount is {0}'"
Machen
StringFormatMultiConverter : IMultiValueConverter
Sie auch, wenn Sie beispielsweise mehr als ein Objekt im Format string benötigenCompleted {0} tasks out of {1}
.quelle
XAML
Ansatzes als auch des Wertekonverters erkennen.Ich habe es gerade überprüft und aus irgendeinem Grund funktioniert es nicht mit dem Label, wahrscheinlich weil es intern einen ContentPresenter für die Content-Eigenschaft verwendet. Sie können stattdessen einen TextBlock verwenden, und das wird funktionieren. Sie können den folgenden TextBlock-Auszug auch in den Inhalt eines Labels einfügen, wenn Sie Stil, Verhalten usw. erben müssen.
<TextBlock Text="{Binding Path=MaxLevelofInvestment, StringFormat='Amount is \{0\}'} />
quelle
Versuchen Sie es mit einem Konverter ....
<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; } }
quelle
Vielleicht hilft das ...
Code in XAML einbetten
quelle