2009-08-25 61 views
12

我有一个值转换器格式化数字(我不能使用SP1,但不幸)。它工作正常,直到它获得一个百分比。如何在XAML标记扩展属性文字中转义单引号?

下面是一个例子:

<TextBlock Text="{Binding Path=PercentageComplete, 
          Converter={StaticResource NumberFormatter}, 
          ConverterParameter='0.00 %'}" /> 

不幸的是,当我看到Double.ToString一个百分比字符,它乘以100乘以数量就我而言,这个数字已经是一个百分比,无需转换。

在C#中,这将通过用单引号转义字符%来实现:

(99.99).ToString("0.00 %") // gives -> "9999 %" 
(99.99).ToString("0.00 '%") // gives -> "99.99 %" 

不幸的是,我不能在上面的XAML标记扩展使用在ConverterParameter一个单引号。有逃避它的方法吗?我已经尝试加倍单引号并使用反斜杠,但都未能编译。

回答

11

未经检验的,但你有没有尝试过:

<TextBlock Text="{Binding Path=PercentageComplete, 
         Converter={StaticResource NumberFormatter}, 
         ConverterParameter=&quot;0.00 '%&quot;}" /> 
+1

太棒了。像魅力一样工作,尽管我更喜欢这种也适用的变体(并且我只在您的建议后尝试过):'ConverterParameter ='0.00 "%''。非常感谢。 – 2009-08-25 20:40:55

+0

另外值得指出的是,我提到的变体不会导致VS以红色标记后续代码,即使它编译得很好。 – 2009-08-25 20:43:19

+0

具有讽刺意味的是,我有类似的东西,但认为它会更好地工作,所以改变了它:) – 2009-08-25 20:52:54

2

下面是避免标记扩展,虽然它不是直接回答问题的解决方法。

<TextBlock> 
    <TextBlock.Text> 
    <Binding Path="PercentageComplete" 
      Converter="{StaticResource NumberFormatter}" 
      ConverterParameter="0.00 '%" /> 
    </TextBlock.Text> 
</TextBlock> 
3

可以使用的String.Format的Double.ToString

代替
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { 
    string format = (string) parameter; 

    return String.Format(format, value); 
} 

而在你的绑定表达式,使用特殊{}转义序列:

<TextBlock Text="{Binding PercentageComplete, Converter={StaticResource NumberFormatter}, ConverterParameter='{}{0:0.00} %'}"></TextBlock> 
9

下面取从http://msdn.microsoft.com/en-us/library/ee200269.aspx

您可以使用反斜杠转义任何字符。它不解析反斜杠,但只是跳过它们。所以:

  • 'foo\'bar'变成foo'bar;
  • "foo\"bar"变成foo"bar;
  • 'foo\\bar'变成foo\bar;
  • 'foo\nbar'变成foonbar而不是换行符。

但是,标记扩展解析很奇怪。即使Visual Studio语法高亮显示不支持它,除\{},=以外的任何字符都是有效的值字符。这意味着下面的结构是合法的:

  • {MyExtension Name=foo'bar}(行情必须要考虑引用一个字符串的第一个字符;其他地方它只是逐字复制);
  • {MyExtension Name=f oo}(空格也是合法的;这成为f oo);
  • {MyExtension Name= foo }(值附近的空格被修剪;这成为foo);
  • {MyExtension Name=foo\\bar}\被逐字复制后的字符,所以这成为foo\bar);
  • {MyExtension Name=foo \\ bar}(这变成foo \ bar);
  • {MyExtension Name=foo \} bar}(并且这成为foo } bar)。

请注意,\规则也适用于此处:跟在\之后的任何字符都被逐字复制。

+2

你测试过了吗?我在这里有一个例子,我想将'\ t'作为ConverterParameter插入。 '\ t'给我't'和'\'t'给我'\'t'。 – Mixxiphoid 2012-01-10 14:23:47

+0

事实上,我无法重复上述规定的结果。 ''< - 构造函数和属性值都会像'foo \\ bar'那样精确返回。 – 2017-03-26 14:54:27

相关问题