WPF StringFormat на содержании ярлыков

Я хочу отформатировать привязку к Amount is X поскольку Amount is X где X – свойство, связанное с меткой.

Я видел много примеров, но следующее не работает:

  

Я также пробовал эти комбинации:

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

Я даже попытался изменить тип данных свойства привязки на int , string и double . Ничто не работает. Это очень распространенный случай использования, но, похоже, он не поддерживается.

Причина, по которой это не работает, заключается в том, что свойство Label.Content имеет тип Object , а Binding.StringFormat используется только при привязке к свойству типа String .

Что происходит:

  1. Binding боксирует ваше значение MaxLevelOfInvestment и сохраняет его свойство Label.Content как десятичное значение в коробке.
  2. Элемент управления Label имеет шаблон, который включает ContentPresenter .
  3. Поскольку ContentTemplate не установлен, ContentPresenter ищет DataTemplate определенный для типа Decimal . Когда он не находит ничего, он использует шаблон по умолчанию.
  4. Шаблон по умолчанию, используемый ContentPresenter представляет строки с использованием свойства ContentStringFormat .

Возможны два решения:

  • Используйте Label.ContentStringFormat вместо Binding.StringFormat или
  • Используйте свойство String, например TextBlock.Text, вместо Label.Content

Вот как использовать Label.ContentStringFormat:

  

Вот как использовать TextBlock:

  

Примечание. Для простоты я пропустил одну деталь в приведенном выше объяснении: ContentPresenter фактически использует свои собственные свойства Template и StringFormat , но во время загрузки они автоматически привязаны к ContentStringFormat свойств ContentStringFormat и ContentStringFormat Label , поэтому кажется, что ContentPresenter фактически использует свойства Label .

Я только что проверил, и по какой-то причине он не работает с Label, вероятно, потому, что он использует ContentPresenter для свойства Content внутри. Вместо этого вы можете использовать TextBlock, и это сработает. Вы также можете разместить выдержку TextBlock ниже в содержании метки, если вам нужно наследовать стиль, поведение и т. Д.

 

Сделайте универсальный StringFormatConverter : IValueConverter . Передайте свою строку формата как ConverterParameter .

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

Кроме того, создайте StringFormatMultiConverter : IMultiValueConverter когда вам нужно больше одного объекта в строке формата, например, Completed {0} tasks out of {1} .

Попробуйте использовать конвертер ….

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

Может быть, это поможет …

Код для вставки в XAML

  • Свяжите элемент с двумя источниками
  • Как связать команду в WPF с обработчиком события двойного щелчка элемента управления?
  • Как связать перечисление с элементом управления combobox в WPF?
  • В bash, как связать функциональный ключ с командой?
  • Связанное с WPF привязка данных свойств
  • Пользовательское связующее устройство для объекта
  • Список привязок к DataGridView в WinForm
  • MvvmCross Android - альтернатива привязке RelativeSource для команды button
  • Как связать List с элементом управления DataGridView?
  • когда вызывается цикл $ digest?
  • В .NET 4.0 привязка OneWayToSource
  • Давайте будем гением компьютера.