Bindet nur einen Teil eines Etiketts
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?
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.