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 Binding - значение по умолчанию для пустой строки
  • Используйте «real» CultureInfo.CurrentCulture в привязке WPF, а не CultureInfo от IetfLanguageTag
  • Разница между {Binding PropertyName} и {Binding Path = PropertyName}
  • Конфликты Datacontext
  • Как связать перечисление с элементом управления combobox в WPF?
  • Ошибка WPF: не удается найти управляющий элемент FrameworkElement для целевого элемента
  • «Элемент коллекции должен быть пустым перед использованием ItemsSource».
  • WinForms DataGridView - привязка к объекту со свойством списка (переменное число столбцов)
  • Как повысить свойства Измененные события в зависимости от свойства?
  • Пользовательское связующее устройство DateTime в Asp.net MVC
  • Привязка видимости кнопки к значению bool в ViewModel
  • Interesting Posts

    COM-объект, который был отделен от его базового RCW, не может быть использован

    Как работают матчи Mockito?

    Должен ли доступ к SharedPreferences делать из streamа пользовательского интерфейса?

    В android 4.4, прокручивание приложения из последних задач постоянно убивает приложение своим сервисом. Любая идея почему?

    Как я могу остановить Mac OS X, переопределяя мое имя хоста, когда я получаю запрос DHCP на Snow Leopard?

    Настройка пользовательского агента java URLConnection

    Синтаксис стилей синтаксиса C ++

    Внешний жесткий диск не распознается компьютером

    Страница пользовательской ошибки ASP.NET – Server.GetLastError () – null

    Вставить разрыв строки / специальный символ в строке в командной строке

    Web API 2: как вернуть JSON с именами свойств camelCased, на объекты и их под-объекты

    Есть ли бесплатная библиотека OCR для Android?

    Ant: Как выполнить команду для каждого файла в каталоге?

    Цикл с вызовом функции быстрее, чем пустой цикл

    Ant, загрузка набора файлов с удаленной машины

    Давайте будем гением компьютера.