Связывание только части ярлыка
Как можно добиться смешивания связанных значений с постоянным текстом в привязке WPF?
Например, скажем, у меня есть форма, отображающая заказы, и мне нужна метка, на которой отображается текст типа "Order ID 1234".
Я пробовал такие вещи, как:
text="Order ID {Binding ....}"
Является ли это достижимым, или мне нужно делать что-то вроде наличия более одного ярлыка в управлении потоком?
Ответы
Ответ 1
Если вы используете 3.5 SP1, вы можете использовать свойство StringFormat
для привязки:
<Label Content="{Binding Order.ID, StringFormat=Order ID \{0\}}"/>
В противном случае используйте конвертер:
<local:StringFormatConverter x:Key="StringFormatter" StringFormat="Order ID {0}" />
<Label Content="{Binding Order.ID, Converter=StringFormatter}"/>
Если StringFormatConverter
является IValueConverter
:
[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();
}
Это будет трюк.
[ Изменить: измените свойство Text
на Content
]
Ответ 2
Свойство Binding.StringFormat не работает с метками, необходимо использовать свойство ContentStringFormat для метки.
Например, будет работать следующий пример:
<Label>
<Label.Content>
<Binding Path="QuestionnaireName"/>
</Label.Content>
<Label.ContentStringFormat>
Thank you for taking the {0} questionnaire
</Label.ContentStringFormat>
</Label>
Так же, как короткая версия:
<Label Content="{Binding QuestionnaireName}" ContentStringFormat="Thank you for taking the {0} questionnaire" />
Используя его для отображения единицы после значения:
<Label Content="{Binding Temperature}" ContentStringFormat="{}{0}°C" />
Пока этот образец не будет:
<Label>
<Label.Content>
<Binding Path="QuestionnaireName" StringFormat="Thank you for taking the {0} questionnaire"/>
</Label.Content>
</Label>
Ответ 3
Часто игнорируется просто объединение нескольких текстовых блоков, например
<TextBlock Text="{Binding FirstName}" />
<TextBlock Text=" " />
<TextBlock Text="{Binding LastName}" />
Ответ 4
Другим подходом является использование одного TextBlock с несколькими элементами Run внутри него:
<TextBlock><Run>Hello</Run><Run>World</Run></TextBlock>
.., но для привязки к элементу, который вам нужно использовать, добавьте класс BindableRun.
Обновление Но есть некоторые недостатки в этой технике... см. здесь
Ответ 5
Я нашел еще один подход. Решение @Inferis не работает для меня, а @LPCRoy не изящна для меня:
<Label Content="{Binding Path=Order.ID, FallbackValue=Placeholder}" ContentStringFormat="Order ID {0}">
Это мой любимый в этот момент, он кажется гибким и сжатым.
Ответ 6
Доработал николай ответ.
<Label Content="{Binding Order.ID}" ContentStringFormat="Order ID {0}" />
FallbackValue не является обязательным.