Ответ 1
Неподтвержденный, но вы пробовали:
<TextBlock Text="{Binding Path=PercentageComplete,
Converter={StaticResource NumberFormatter},
ConverterParameter="0.00 '%"}" />
У меня есть конвертер значений, который форматирует числа (к сожалению, я еще не могу использовать SP1). Он отлично работает, пока не получит процент.
Вот пример:
<TextBlock Text="{Binding Path=PercentageComplete,
Converter={StaticResource NumberFormatter},
ConverterParameter='0.00 %'}" />
К сожалению для меня, когда Double.ToString
видит процентный символ, он умножает число на 100. В моем случае число уже является процентом, и преобразование не требуется.
В С# это будет достигнуто путем экранирования символа %
с помощью одной кавычки:
(99.99).ToString("0.00 %") // gives -> "9999 %"
(99.99).ToString("0.00 '%") // gives -> "99.99 %"
К сожалению, я не могу использовать одну цитату в ConverterParameter
в вышеупомянутом расширении разметки XAML. Есть способ избежать этого? Я попытался удвоить одиночные кавычки и использовать обратную косую черту, но оба не удалось скомпилировать.
Неподтвержденный, но вы пробовали:
<TextBlock Text="{Binding Path=PercentageComplete,
Converter={StaticResource NumberFormatter},
ConverterParameter="0.00 '%"}" />
Ниже приведена 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
).Обратите внимание, что здесь применяются правила \
: любой символ, следующий за \
, копируется дословно.
Вы можете использовать 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 );
}
И в вашем выражении привязки используйте специальную {} escape-последовательность:
<TextBlock Text="{Binding PercentageComplete, Converter={StaticResource NumberFormatter}, ConverterParameter='{}{0:0.00} %'}"></TextBlock>
Вот обходной путь, который позволяет избежать расширения разметки, хотя это не прямой ответ на вопрос.
<TextBlock>
<TextBlock.Text>
<Binding Path="PercentageComplete"
Converter="{StaticResource NumberFormatter}"
ConverterParameter="0.00 '%" />
</TextBlock.Text>
</TextBlock>