WPF StringFormat на содержании ярлыков
Я хочу отформатировать привязку к Amount is X
поскольку Amount is X
где X
– свойство, связанное с меткой.
Я видел много примеров, но следующее не работает:
Я также пробовал эти комбинации:
- Кто-нибудь знает набор привязок C # для FFMPEG?
- Отменить изменения в сущностных сущностях
- Связывание со статическим свойством
- Как вы привязываете CollectionContainer к коллекции в модели представления?
- WPF: привязать DataGrid к списку
StringFormat=Amount is {0} StringFormat='Amount is {}{0}' StringFormat='Amount is \{0\}'
Я даже попытался изменить тип данных свойства привязки на int
, string
и double
. Ничто не работает. Это очень распространенный случай использования, но, похоже, он не поддерживается.
- Загрузка файлов с Java-клиента на HTTP-сервер
- MVVM: привязка переключателей к модели просмотра?
- Как скрыть столбцы datagrid wpf в зависимости от свойства
- Программно прокрутите до метки привязки
- Как форматировать столбцы DateTime в DataGridView?
- ComboBox.SelectedValue не обновляется из источника привязки
- Связанное с WPF привязка данных свойств
- Свяжите элемент с двумя источниками
Причина, по которой это не работает, заключается в том, что свойство Label.Content
имеет тип Object
, а Binding.StringFormat
используется только при привязке к свойству типа String
.
Что происходит:
-
Binding
боксирует ваше значениеMaxLevelOfInvestment
и сохраняет его свойствоLabel.Content
как десятичное значение в коробке. - Элемент управления Label имеет шаблон, который включает
ContentPresenter
. - Поскольку
ContentTemplate
не установлен,ContentPresenter
ищетDataTemplate
определенный для типаDecimal
. Когда он не находит ничего, он использует шаблон по умолчанию. - Шаблон по умолчанию, используемый
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