wake-up-neo.com

WPF StringFormat für den Etiketteninhalt

Ich möchte meine Zeichenfolgenbindung als Amount is X formatieren, wobei X eine Eigenschaft ist, die an ein Label gebunden ist.

Ich habe viele Beispiele gesehen, aber folgendes funktioniert nicht:

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

Ich habe auch diese Kombinationen ausprobiert:

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

Ich habe sogar versucht, den Datentyp der Bindungseigenschaft in int, stringund double zu ändern. Nichts scheint zu funktionieren. Dies ist ein sehr häufiger Anwendungsfall, scheint aber nicht unterstützt zu werden.

60

Der Grund, warum dies nicht funktioniert, ist, dass die Label.Content -Eigenschaft ist vom Typ Object und Binding.StringFormat wird nur beim Binden an eine Eigenschaft vom Typ String verwendet.

Was passiert ist:

  1. Der Binding boxt Ihren MaxLevelOfInvestment -Wert und speichert ihn im Label.Content -Eigenschaft als geschachtelter Dezimalwert.
  2. Das Label-Steuerelement verfügt über eine Vorlage, die ein ContentPresenter enthält.
  3. Da ContentTemplate nicht gesetzt ist, sucht ContentPresenter nach einem DataTemplate, der für den Typ Decimal definiert ist. Wenn keine gefunden wird, wird eine Standardvorlage verwendet.
  4. Die von ContentPresenter verwendete Standardvorlage stellt Zeichenfolgen mithilfe der Eigenschaft ContentStringFormat des Etiketts dar.

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 Erläuterung ein Detail weggelassen: Das ContentPresenter verwendet tatsächlich seine eigenen Eigenschaften Template und StringFormat, aber diese werden beim Laden automatisch vorlagenbasiert. an die Eigenschaften ContentTemplate und ContentStringFormat des Label gebunden, so dass der ContentPresenter tatsächlich den Label Eigenschaften.

175
Ray Burns

Ich habe es gerade überprüft und funktioniert aus irgendeinem Grund 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 funktioniert. Sie können auch den TextBlock-Auszug unten in den Inhalt eines Labels einfügen, wenn Sie Stil, Verhalten usw. übernehmen möchten.

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

Machen Sie einen universellen StringFormatConverter : IValueConverter. Übergeben Sie Ihre Formatzeichenfolge als ConverterParameter.

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

Erstellen Sie auch StringFormatMultiConverter : IMultiValueConverter, wenn Sie mehr als ein Objekt in der Formatzeichenfolge benötigen, beispielsweise Completed {0} tasks out of {1}.

3

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;
    }
}
1
Gabe

Vielleicht hilft das ...

Code in XAML einbetten

0
strattonn