不能在XAML绑定的StringFormat中使用撇号?

时间:2011-10-31 05:45:20

标签: c# wpf escaping apostrophe string-formatting

我正在尝试使用StringFormat在一个绑定到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的错误吗?

4 个答案:

答案 0 :(得分:17)

我不确定这是不是一个错误,但我测试了这个方法,它的确有效:

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

像StringFormat中的单引号似乎必须使用\进行转义,而不是传统的XML样式&apos;

答案 1 :(得分:9)

尝试在\之前使用&apos

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

答案 2 :(得分:0)

这个唯一的解决方案对我有用:删除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上测试)

答案 3 :(得分:0)

UWP刚为TimeSpan值创建StringFormatConverter ConverterParameter时遇到了此问题。由于某些疯狂的原因,TimeSpan.ToString(x)自定义格式字符串需要在文字字符前后加上撇号,即使DateTimeOffset不需要。似乎不必要地不一致。

无论如何...以上都不成功。一种方法可以使XAML设计器显示/工作,但是却产生了构建错误。

我确定的解决方案是将格式字符串放入最接近的封闭元素的字符串资源中。由于我在使用Border创建的框中显示值,因此将格式字符串填充到Border元素的资源中。

StringFormatConverter是NuGet上的Microsoft UWP Toolkit中的一个。

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