Как я могу избежать одиночной кавычки в литерале свойства расширения разметки XAML? - PullRequest
12 голосов
/ 26 августа 2009

У меня есть конвертер значений, который форматирует числа (к сожалению, я пока не могу использовать 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 ]

11 голосов
/ 26 августа 2009

Не проверено, но вы пробовали:

<TextBlock Text="{Binding Path=PercentageComplete,
                      Converter={StaticResource NumberFormatter},
                      ConverterParameter=&quot;0.00 '%&quot;}" />
9 голосов
/ 10 января 2012

Ниже взято из 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).

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

3 голосов
/ 26 августа 2009

Вы можете использовать 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>
2 голосов
/ 26 августа 2009

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

<TextBlock>
  <TextBlock.Text>
    <Binding Path="PercentageComplete"
             Converter="{StaticResource NumberFormatter}"
             ConverterParameter="0.00 '%" />
  </TextBlock.Text>
</TextBlock>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...