Frage

Wie würde man gebundene Werte mit konstantem Text in einem WPF-gebundenen Steuerelement mischen?

Angenommen, ich habe ein Formular, in dem Bestellungen angezeigt werden, und ich möchte eine Beschriftung mit Text wie „Bestell-ID 1234“.

Ich habe Dinge ausprobiert wie:

text="Order ID {Binding ....}"

Ist das erreichbar oder muss ich so etwas wie mehr als eine Beschriftung in einer Flusskontrolle haben?

War es hilfreich?

Lösung

Wenn Sie 3.5 SP1 verwenden, können Sie die StringFormat Eigenschaft auf der Bindung verwenden:

<Label Content="{Binding Order.ID, StringFormat=Order ID \{0\}}"/>

Verwenden Sie andernfalls einen Konverter:

<local:StringFormatConverter x:Key="StringFormatter" StringFormat="Order ID {0}" />
<Label Content="{Binding Order.ID, Converter=StringFormatter}"/>

Mit StringFormatConverter eine IValueConverter sein:

[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();
    }

Das wird den Trick tun.

[ Bearbeiten : Ändern Sie die Text Eigenschaft Content]

Andere Tipps

Die Binding.StringFormat Eigenschaft nicht auf Etiketten nicht funktioniert, müssen Sie die Content Eigenschaft auf dem Etikett verwenden.
Zum Beispiel wird das folgende Beispiel arbeiten:

<Label>
    <Label.Content>
        <Binding Path="QuestionnaireName"/>
    </Label.Content>
    <Label.ContentStringFormat>
        Thank you for taking the {0} questionnaire
    </Label.ContentStringFormat>
</Label> 

Die gleiche wie kurze Version:

<Label Content="{Binding QuestionnaireName}" ContentStringFormat="Thank you for taking the {0} questionnaire" />

Verwenden sie eine Einheit nach dem Wert anzuzeigen:

<Label Content="{Binding Temperature}" ContentStringFormat="{}{0}°C" />

Während diese Probe nicht:

<Label>
    <Label.Content>
        <Binding Path="QuestionnaireName" StringFormat="Thank you for taking the {0} questionnaire"/>
    </Label.Content>            
</Label>

Oft übersehen wird beispielsweise die einfache Verkettung mehrerer Textblöcke

<TextBlock Text="{Binding FirstName}" />
<TextBlock Text=" " />
<TextBlock Text="{Binding LastName}" />

Ein weiterer Ansatz ist es, einen einzigen Textblock mit mehreren Run-Elementen innerhalb es zu benutzen:

<TextBlock><Run>Hello</Run><Run>World</Run></TextBlock>

.. aber auf ein Element binden Sie eine BindableRun Klasse hinzufügen verwenden müssen .

Aktualisieren Aber es gibt einige Nachteile dieser Technik ... siehe hier

Ich fand einen anderen Ansatz. @ Inferis-Lösung nicht für mich und @ LPCRoy das funktioniert, ist für mich nicht elegant:

<Label Content="{Binding Path=Order.ID, FallbackValue=Placeholder}" ContentStringFormat="Order ID {0}">

Es ist mein Liebling in diesem Moment, es scheint flexibel und kondensierte.

Modifizierte Mikolaj Antwort.

<Label Content="{Binding Order.ID}" ContentStringFormat="Order ID {0}" />

FallbackValue ist kein Muss.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top