Что такое связывание данных WPF XAML, эквивалентное String.Format? - PullRequest
31 голосов
/ 15 января 2009

Или, чтобы быть более понятным, как я могу отформатировать блок текста (в моем случае, чтобы быть включенным во всплывающую подсказку), чтобы некоторые части текста происходили из связанных значений.

В простом C # я бы использовал:

_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?

Ответы [ 5 ]

45 голосов
/ 15 января 2009

Вы можете использовать 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 - вы не можете привязать его, но есть некоторые обходные пути:

11 голосов
/ 09 февраля 2010

Я бы разбил на несколько текстовых блоков, связывая каждый из них с StringFormat = {0: P} в привязке следующим образом:

<TextBox Text="{Binding Something, StringFormat=\{0:P\}}" />

См. Этот пост для примеров: Блог Лестера WPF на StringFormat

Оформить заказ VS2010 - привязка из свойств включает форматирование в параметрах.

3 голосов
/ 15 января 2009

Если вы используете 3.5 SP1, ответ Аку - путь. Если нет, вы можете использовать FormatConverter из моей библиотеки WPF Converters .

2 голосов
/ 15 января 2009

Способ, который я решил в прошлом, на самом деле состоит в том, чтобы разбить текстовый блок, который у вас есть в листинге, на несколько текстовых блоков. Попробуйте что-то вроде этого:

<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 Info

А это для информации о преобразователях:

Информация о преобразователях

Вы можете довольно легко представить преобразователь, который принимает «значения объекта []» вместо «значения объекта» в качестве первого параметра и передает их в функцию «Формат».

2 голосов
/ 15 января 2009

Насколько я знаю, WPF не делает то, что вы хотите. У вас есть гораздо более мощное (хотя и более сложное) решение.

Посмотрите на интерфейс IValueConverter .

MSDN HowTo link здесь

EDIT

Основываясь на ответе aku и вашем утверждении, что вы не можете использовать 3.5 SP1, вот альтернатива.

Взгляните на недавнюю серию публикаций Фила Хаака о форматировании строк:

Создайте ValueConverter, так как он принимает формат как свойство. После этого вы сможете связать свой объект данных и иметь его формат на основе вашего заданного формата (используя имя свойства вместо позиции).

...