2010-11-17 10 views
48

Ich möchte meine String-Bindung als Amount is X formatieren, wobei X eine Eigenschaft ist, die an eine Bezeichnung gebunden ist.WPF StringFormat auf Etiketteninhalt

Ich habe viele Beispiele gesehen, aber die folgende nicht funktioniert:

<Label Content="{Binding Path=MaxLevelofInvestment, 
    StringFormat='Amount is {0}'}" /> 

Ich habe auch versucht, diese Kombinationen:

StringFormat=Amount is {0} 
StringFormat='Amount is {}{0}' 
StringFormat='Amount is \{0\}' 

ich auch die Bindungseigenschaft des Datentyps zu int versucht zu ändern , string und double. Nichts scheint zu funktionieren. Dies ist ein sehr häufiger Anwendungsfall, wird jedoch anscheinend nicht unterstützt.

Antwort

138

Der Grund, warum dies nicht der Fall funktioniert, dass die Label.Content Eigenschaft vom Typ ist Object und Binding.StringFormat wird nur verwendet, wenn an eine Eigenschaft des Typs String gebunden wird.

Was geschieht, ist:

  1. The Binding ist Ihr MaxLevelOfInvestment Wert Boxen und die Label.Content Eigenschaft als Box-Dezimalwert zu speichern.
  2. Das Label-Steuerelement verfügt über eine Vorlage, die eine ContentPresenter enthält.
  3. Da ContentTemplate nicht festgelegt ist, sucht ContentPresenter nach einem DataTemplate definierten Typ Decimal. Wenn keine gefunden wird, wird eine Standardvorlage verwendet.
  4. Die Standardvorlage, die von ContentPresenter verwendet wird, stellt Zeichenfolgen unter Verwendung der ContentStringFormat-Eigenschaft des Labels bereit.

Zwei Lösungen sind möglich:

  • Verwenden Label.ContentStringFormat statt Binding.StringFormat oder
  • eine String-Eigenschaft verwenden wie TextBlock.Text statt Label.Content

Hier ist die Verwendung von Label.Content:

<Label Content="{Binding Path=MaxLevelofInvestment}" ContentStringFormat="Amount is {0}" /> 

Hier ist, wie ein Textblock zu verwenden:

<TextBlock Text="{Binding Path=MaxLevelofInvestment, StringFormat='Amount is {0}'}" /> 

Hinweis: Die Einfachheit halber ich ein Detail in der obigen Erläuterung weggelassen: Die ContentPresenter tatsächlich seine eigenen Template und StringFormat Eigenschaften verwendet, aber während Laden diese sind automatisch Template-gebunden an die ContentTemplate und ContentStringFormat Eigenschaften der Label, so scheint es, als ob die ContentPresenter tatsächlich die Label Eigenschaften verwendet.

+0

danke für die ausführliche Erklärung, jetzt macht es Sinn. bis zum WPF-Team, um das für die Zukunft ordentlich zu machen. –

+0

Ich mag deine Antwort, würdest du wissen, wie man 2 params anstatt nur 1 verwendet? Wirklich Schwierigkeiten hier (wie TextBlock StringFormat kann mehrere handhaben, wenn Sie Trigger usw. verwenden). – EricG

1

Versuchen Sie, einen 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; 
    } 
} 
+2

Dies ist nicht notwendig und verbirgt das Format in Code-Behind. – SLaks

+0

Vielleicht, aber das wird das Problem lösen. – Gabe

+3

Es ist Overkill. Ich erkläre die Ursache des Problems und präsentiere zwei einfache Lösungen in meiner Antwort. –

3

ich gerade überprüft und aus irgendeinem Grunde ist es nicht mit dem Label arbeiten, wahrscheinlich, weil es intern ein Content für die Content-Eigenschaft verwendet. Sie können stattdessen einen Textblock verwenden, und das wird funktionieren. Sie können auch unten in den Inhalt eines Etiketts die TextBlock- Ausschnitt setzen, wenn Sie Styling etc. Verhalten erben müssen

<TextBlock Text="{Binding Path=MaxLevelofInvestment, StringFormat='Amount is \{0\}'} /> 
2

ein universelles StringFormatConverter : IValueConverter machen. Übergeben Sie Ihre Formatzeichenfolge als ConverterParameter.

Label Content="{Binding Amount, Converter={...myConverter}, ConverterParameter='Amount is {0}'" 

Auch machen StringFormatMultiConverter : IMultiValueConverter, wenn Sie mehr als ein Objekt in Format-String benötigen, zum Beispiel Completed {0} tasks out of {1}.

+0

Ich mag das. Ich kann den Wert der Verwendung des reinen XAML-Ansatzes oder des Wertkonverters sehen. – IAbstract

Verwandte Themen