14

我有一个格式化数字的值转换器(不幸的是我还不能使用 SP1)。它工作正常,直到它得到一个百分比。

这是一个例子:

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

不幸的是,我不能ConverterParameter在上面的 XAML 标记扩展中使用单引号。有没有办法逃脱它?我尝试将单引号加倍并使用反斜杠,但都无法编译。

4

4 回答 4

13

未经测试,但您是否尝试过:

<TextBlock Text="{Binding Path=PercentageComplete,
                      Converter={StaticResource NumberFormatter},
                      ConverterParameter=&quot;0.00 '%&quot;}" />
于 2009-08-25T20:34:40.140 回答
10

以下内容来自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}(a 之后的字符\被逐字复制,因此变为foo\bar);
  • {MyExtension Name=foo \\ bar}(这变成foo \ bar);
  • {MyExtension Name=foo \} bar}(这变成了foo } bar)。

请注意,\这里也适用规则:a 后面的任何字符\都被逐字复制。

于 2012-01-10T14:10:01.120 回答
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>
于 2009-08-25T20:41:39.597 回答
2

这是一种避免标记扩展的解决方法,尽管它不是问题的直接答案。

<TextBlock>
  <TextBlock.Text>
    <Binding Path="PercentageComplete"
             Converter="{StaticResource NumberFormatter}"
             ConverterParameter="0.00 '%" />
  </TextBlock.Text>
</TextBlock>
于 2009-08-25T20:36:43.587 回答