2010-11-17 7 views
48

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

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

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

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

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

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

ответ

138

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

Происходящий:

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

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

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

Вот как использовать ярлык.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.

+0

спасибо за подробное объяснение, теперь это имеет смысл. до команды WPF, чтобы сделать это опрятным в будущем. –

+0

Мне нравится ваш ответ, вы знаете, как использовать 2 параметра вместо 1? На самом деле борется здесь (например, TextBlock stringFormat может обрабатывать несколько при использовании триггеров и т. Д.). – EricG

1

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

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

Это необязательно и скрывает формат кода. – SLaks

+0

Возможно, так, но это решит проблему. – Gabe

+3

Это перебор. Я объясняю причину проблемы и представляю два простых решения в своем ответе. –

3

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

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

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

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

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

+0

Мне это нравится. Я вижу значение использования как чистого подхода «XAML», так и преобразователя значений. – IAbstract