Невозможно использовать апостроф в StringFormat привязки XAML?

Я пытаюсь использовать StringFormat для вставки апострофии (apostrophe?) вокруг значения, связанного с TextBlock:

<TextBlock Text="{Binding MyValue, StringFormat='The value is &apos;{0}&apos;'}"/>

Однако я получаю ошибку компиляции:

Имена и значения в MarkupExtension не могут содержать кавычки. Аргументы MarkupExtension 'MyValue, StringFormat =' Значение '{0}' '}' недействительны.

Я замечаю, что он работает для кавычек:

<TextBlock Text="{Binding MyValue, StringFormat='The value is &quot;{0}&quot;'}"/>

Является ли это ошибкой с StringFormat?

Ответ 1

Я не уверен, что это ошибка, но я протестировал этот метод, и он работает:

<TextBlock Text="{Binding MyValue, StringFormat='The value is \'{0}\''}" />

Кажется, что одиночные кавычки внутри StringFormat должны быть экранированы с помощью \ в отличие от традиционного стиля XML &apos;

Ответ 2

Попробуйте использовать \ до &apos:

<TextBlock Text="{Binding MyValue, StringFormat='The value is \&apos;{0}\&apos;'}"/>

Ответ 3

Это единственное решение сработало для меня: удалите кавычки FallbackValue (!), А затем экранируйте специальный символ.

<TextBlock Text="{Binding StateCaption, FallbackValue=It couldn\'t be more weird}" />

Даже VS2017 XAML Intellisense потерян! он отображает "Это" синим цветом, "не может" красным и "быть более странным" синим... но это работает.

Я даже протестировал этот более сложный случай, и атрибуты, следующие за текстом с пробелами и без кавычек, правильно интерпретируются:

<TextBlock Text="{Binding StateCaption, StringFormat=It couldn\'t be more weird,FallbackValue=test}" />

(протестировано на VS2017, Framework 4.0)

Ответ 4

Только что столкнулся с этой проблемой для UWP при создании StringFormatConverter ConverterParameter для значения TimeSpan. Строка нестандартного формата TimeSpan.ToString(x) по какой-то безумной причине требует апострофов вокруг буквенных символов, хотя DateTimeOffset этого не делает. Кажется излишне противоречивым.

Во всяком случае... Ничто из перечисленного не сработало успешно. Один подход сработал так, чтобы заставить дизайнер XAML отображать/работать, но он создал ошибку сборки.

Решение, на котором я остановился, состояло в том, чтобы поместить строку формата в строковый ресурс ближайшего включающего элемента. Поскольку я отображал значение в поле, созданном с помощью Border, я вставил строку формата в ресурсы элемента Border.

StringFormatConverter - это набор инструментов Microsoft UWP на NuGet.

<StackPanel Orientation="Horizontal">
  <TextBlock Text="Timespan=" />
  <Border BorderBrush="Black" BorderThickness="0.5" Padding="2">
    <Border.Resources>
      <x:String x:Key="TimespanValueConverterParameter">{0:hh':'mm':'ss'.'fff}</x:String>
    </Border.Resources>
    <TextBlock Text="{Binding TimespanValue, Mode=OneWay, Converter={StaticResource StringFormatConverter}, ConverterParameter={StaticResource TimespanValueConverterParameter}}" />
  </Border>
</StackPanel>