2009-08-25 14 views
12

Mam konwerter wartości, który formatuje numery (nie mogę jeszcze używać SP1 jeszcze niestety). Działa dobrze, dopóki nie uzyska procentu.Jak można uciec z pojedynczego cudzysłowu w dosłownym języku znacznika rozszerzenia XAML?

Oto przykład:

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

Niestety dla mnie, kiedy Double.ToString widzi charakter procentowy, to mnoży przez liczbę 100. W moim przypadku, numer jest już pewien procent i nie ma potrzeby konwersji.

W języku C#, byłoby to osiągnąć poprzez ucieczkę charakter % z jednym cytatem:

(99.99).ToString("0.00 %") // gives -> "9999 %" 
(99.99).ToString("0.00 '%") // gives -> "99.99 %" 

Niestety, nie mogę użyć pojedynczego cudzysłowu w ConverterParameter w powyższym rozszerzenie XAML znaczników. Czy istnieje sposób na ucieczkę? Próbowałem podwajać pojedyncze cudzysłowy i używać odwrotnego ukośnika, ale oba nie udało się skompilować.

Odpowiedz

11

Nietestowane, ale czy próbowałeś:

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

Fantastyczne. Działa jak urok, ale ja wolę ten wariant, który działa również (i próbowałem tylko po twojej sugestii): 'ConverterParameter = '0.00 "%''. Wielkie dzięki. –

+0

Warto również zauważyć, że wspomniany wariant nie powoduje, że VS zaznacza kolejny kod na czerwono, mimo że kompiluje się dobrze. –

+0

Jak na ironię, miałem coś podobnego, ale pomyślałem, że lepiej będzie działać na odwrót, więc go zmieniono :) –

2

Tutaj jest rozwiązanie, które pozwala uniknąć rozszerzenia znaczników, choć nie jest to bezpośrednia odpowiedź na pytanie.

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

Można użyć String.Format zamiast Double.ToString

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { 
    string format = (string) parameter; 

    return String.Format(format, value); 
} 

A w swojej wypowiedzi wiążącego, użyj specjalnej sekwencji {} ucieczki:

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

Poniżej znajduje się od http://msdn.microsoft.com/en-us/library/ee200269.aspx.

Możesz uciec każdej postaci z odwrotnym ukośnikiem. Nie analizuje odwróconych ukośników, ale po prostu je pomija. A więc:

  • 'foo\'bar' zostaje foo'bar;
  • "foo\"bar" staje się foo"bar;
  • 'foo\\bar' staje się foo\bar;
  • 'foo\nbar' staje się foonbar, a nie znakiem nowej linii.

Jednak analiza wydłużenia znaczników jest dość dziwna. Mimo że podświetlanie składni Visual Studio nie obsługuje tego, każdy znak inny niż \{},= jest poprawnym znakiem wartości.Oznacza to, że następujące konstrukcje są legalne:

  • {MyExtension Name=foo'bar} (cytaty musi być pierwszym znakiem należy uznać za cytowanie ciąg; nigdzie indziej jej po prostu skopiowany dosłownie);
  • {MyExtension Name=f oo} (Przestrzenie są również legalne, to staje się f oo);
  • {MyExtension Name= foo } (spacje wokół wartości są przycinane, to staje się foo);
  • (znaki po \ są kopiowane dosłownie, a więc staje się foo\bar);
  • {MyExtension Name=foo \\ bar} (staje się to foo \ bar);
  • {MyExtension Name=foo \} bar} (a to staje się foo } bar).

Należy zauważyć, że przepisy \ zastosowanie także tutaj: dowolny znak po \ jest kopiowany dosłownie.

+2

Testowałeś to? Mam tutaj przykład, w którym chcę wstawić "\ t" jako ConverterParameter. "\ t" daje mi "t" i "\\ t" daje mi "\\ t". – Mixxiphoid

+0

Rzeczywiście, nie mogę powielić wyników opisanych powyżej. '' <- zarówno konstruktor, jak i wartości właściwości zwracają dokładnie tak, jak zostało to opisane, jako 'foo \\ bar'. –

Powiązane problemy