Что такое привязка данных WPF XAML, эквивалентная String.Format?
Или, чтобы быть более ясным, как я могу отформатировать блок текста (в моем случае, чтобы быть включенным в всплывающую подсказку), так что некоторые части текста поступают из связанных значений.
В простой С# я бы использовал:
_toolTip.Text = string.Format("{1:#0}% up, {2:#0}% down",
Environment.NewLine, percentageOne, percentage2);
Однако разметка WPF XAML для свойства Text может содержать только одну привязку. Кудрявые скобки возлагали на меня большие надежды, но это невозможно:
<Element>
<Element.Tooltip>
<!-- This won't compile -->
<TextBlock Text="{Binding Path=PercentageOne}% up, {Binding Path=PercentageTwo}% down"/>
</Element.Tooltip>
</Element>
Я читал, что свойство Run.Text
не является свойством зависимостей и поэтому не может быть связано.
Есть ли способ, которым я могу выполнить это форматирование в XAML?
Ответы
Ответ 1
Вы можете использовать MultiBinding + StringFormat (требуется WPF 3.5 SP1):
<TextBox.Text>
<MultiBinding StringFormat="{}{1:#0}% up, {2:#0}% down">
<Binding Path="PercentageOne" />
<Binding Path="PercentageTwo"/>
</MultiBinding>
</TextBox.Text>
Относительно Run.Text - вы не можете привязываться к нему, но есть некоторые обходные пути:
Ответ 2
Я бы разделился на несколько текстовых блоков, привязывая каждый из них к StringFormat = {0: P} в привязке как таковой:
<TextBox Text="{Binding Something, StringFormat=\{0:P\}}" />
Смотрите это сообщение для примеров: Блог Lester WPF на StringFormat
Checkout VS2010 - привязка свойств включает форматирование в параметрах.
Ответ 3
Если вы используете 3.5 SP1, ответ Aku - это путь. Если вы этого не сделаете, вы можете использовать FormatConverter из моего WPF Converters.
Ответ 4
Насколько я знаю, WPF не делает то, что вы хотите. У вас есть гораздо более мощное (хотя и более активное) решение.
Посмотрите на IValueConverter интерфейс.
MSDN HowTo link здесь
ИЗМЕНИТЬ
На основе ответа aku и вашего утверждения, что вы не можете использовать 3.5 SP1, здесь альтернатива.
Взгляните на недавнюю серию публикаций Фила Хаака по форматированию строк:
Создайте ValueConverter, поскольку он принимает формат как свойство. Затем вы сможете привязать свой объект данных и форматировать его на основе вашего определенного формата (используя имя свойства вместо позиции).
Ответ 5
Как я решил это в прошлом, на самом деле нужно сломать TextBlock, который у вас есть, в вашем объявлении в несколько текстовых блоков. Попробуйте что-то вроде этого:
<Element>
<Element.Tooltip>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=PercentageOne}"/>
<TextBlock Text="% up, "/>
<TextBlock Text="{Binding Path=PercentageTwo}"/>
<TextBlock Text="% down"/>
</StackPanel>
</Element.Tooltip>
</Element>
В качестве альтернативы вы можете создать нечто вроде StringFormatConverter, которое может принимать строку формата в качестве параметра и использовать MultiBinding для передачи параметров. См. Эту ссылку для MultiBindings:
Информация о MultiBinding
И этот для информации о конвертерах:
Информация о конвертерах
Вы можете легко представить себе конвертер, который принимает "object [] values" вместо "object value" в качестве первого параметра и передает их в функцию Format.