Подтвердить что ты не робот

Как я могу избежать одиночной цитаты в литеральном листе свойств расширения разметки XAML?

У меня есть конвертер значений, который форматирует числа (к сожалению, я еще не могу использовать 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. Есть способ избежать этого? Я попытался удвоить одиночные кавычки и использовать обратную косую черту, но оба не удалось скомпилировать.

4b9b3361

Ответ 1

Неподтвержденный, но вы пробовали:

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

Ответ 2

Ниже приведена 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).

Обратите внимание, что здесь применяются правила \: любой символ, следующий за \, копируется дословно.

Ответ 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 );
}

И в вашем выражении привязки используйте специальную {} escape-последовательность:

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

Ответ 4

Вот обходной путь, который позволяет избежать расширения разметки, хотя это не прямой ответ на вопрос.

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