我有一个格式化数字的值转换器(不幸的是我不能使用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 %"
不幸的是,我不能在上面的XAML标记扩展中的ConverterParameter
中使用单引号。有没有办法逃避它?我尝试将单引号加倍并使用反斜杠,但两者都无法编译。
答案 0 :(得分:11)
未经测试,但您尝试过:
<TextBlock Text="{Binding Path=PercentageComplete,
Converter={StaticResource NumberFormatter},
ConverterParameter="0.00 '%"}" />
答案 1 :(得分: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 :(得分: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>
答案 3 :(得分:2)
这是一种避免使用标记扩展的解决方法,但它不能直接回答问题。
<TextBlock>
<TextBlock.Text>
<Binding Path="PercentageComplete"
Converter="{StaticResource NumberFormatter}"
ConverterParameter="0.00 '%" />
</TextBlock.Text>
</TextBlock>