Используйте StringFormat для добавления строки в привязку WPF XAML

У меня есть приложение WPF 4, которое содержит TextBlock, который имеет одностороннюю привязку к целочисленному значению (в данном случае температура в градусах Цельсия). XAML выглядит следующим образом:

<TextBlock x:Name="textBlockTemperature">
        <Run Text="{Binding CelsiusTemp, Mode=OneWay}"/></TextBlock>

Это прекрасно работает для отображения фактического значения температуры, но я бы хотел отформатировать это значение, чтобы оно включало ° C вместо только числа (30 ° C вместо всего 30). Я читал о StringFormat и видел несколько общих примеров, подобных этому:

// format the bound value as a currency
<TextBlock Text="{Binding Amount, StringFormat={}{0:C}}" />

и

// preface the bound value with a string and format it as a currency
<TextBlock Text="{Binding Amount, StringFormat=Amount: {0:C}}"/>

К сожалению, ни один из примеров, которые я видел, не добавлял строку к связанному значению, как я пытаюсь сделать. Я уверен, что это должно быть что-то простое, но мне не повезло найти его. Может кто-нибудь объяснить мне, как это сделать?

Ответ 1

Ваш первый пример - это то, что вам нужно:

<TextBlock Text="{Binding CelsiusTemp, StringFormat={}{0}°C}" />

Ответ 2

Здесь альтернатива, которая хорошо работает для удобочитаемости, если у вас есть привязка в середине строки или нескольких привязок:

<TextBlock>
  <Run Text="Temperature is "/>
  <Run Text="{Binding CelsiusTemp}"/>
  <Run Text="°C"/>  
</TextBlock>

<!-- displays: 0°C (32°F)-->
<TextBlock>
  <Run Text="{Binding CelsiusTemp}"/>
  <Run Text="°C"/>
  <Run Text=" ("/>
  <Run Text="{Binding Fahrenheit}"/>
  <Run Text="°F)"/>
</TextBlock>

Ответ 3

Обратите внимание, что использование StringFormat в Bindings работает только для "текстовых" свойств. Использование этого для Label.Content не будет работать

Ответ 4

В xaml

<TextBlock Text="{Binding CelsiusTemp}" />

В ViewModel этот способ также устанавливает значение:

 public string CelsiusTemp
        {
            get { return string.Format("{0}°C", _CelsiusTemp); }
            set
            {
                value = value.Replace("°C", "");
              _CelsiusTemp = value;
            }
        }