2009-08-25 59 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

相關問題