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

Что такое привязка данных 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?

4b9b3361

Ответ 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.