Подтвердить что ты не робот

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

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

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

<Label Content="{Binding Path=MaxLevelofInvestment, 
   StringFormat='Amount is {0}'}" />

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

<Label Content="{Binding Path=MaxLevelofInvestment}" ContentStringFormat="Amount is {0}" />

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

<TextBlock Text="{Binding Path=MaxLevelofInvestment, StringFormat='Amount is {0}'}" />

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

Ответ 2

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

<TextBlock Text="{Binding Path=MaxLevelofInvestment, StringFormat='Amount is \{0\}'} />

Ответ 3

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

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

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

Ответ 4

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

<myconverters:MyConverter x:Key="MyConverter"/>


<Label Content="{Binding Path=MaxLevelofInvestment, Converter={StaticResource MyConverter"} />


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