środa, marzec 03, 2010

Rozważania nad Binding.StringFormat

Dzisiejszy wpis bardziej dla mnie na przyszłość ale może ktoś skorzysta.

Ostatnio miałem potrzebę użycia takiej wartości StringFormat, aby jego wartość zaczynała się od spacji. Każdy kto kiedykolwiek bawił się tą właściwością wie, że takie coś jak poniżej nie spełni swojej roli.

<TextBlock FontSize="16" Text="{Binding Value, Mode=OneWay, StringFormat= ({0}) dB}" x:Name="test" />

Zauważcie spację pomiędzy znakiem = a ( w parametrze StringFormat. Wiem, że przykład może naciągany, ale w moim przypadku taki coś było konieczne.

Wynik jest jednak taki jak poniżej.

image

Jak zatem możemy uzyskać prowadzącą spację (leading space po polsku)? StringFormat obsługuje specjalną parę znaków {}. Wystarczy nasz StringFormat rozpocząć od tych znaków a nasza spacja będzie uwzględniona

<TextBlock FontSize="16" Text="{Binding Value, Mode=OneWay, StringFormat={} ({0}) dB}" x:Name="test" />

image

Tę samą sztuczkę musimy zastosować jeśli nasz StringFormat chcemy rozpocząć znakiem {.

W dokumentacji MSDN znak ten pojawia się w przykładzie, ale nie ma nic na jego temat – BindingBase.StringFormat property.

6 komentarze:

Jakub Gutkowski pisze...

Nie wiem czemu ale ja mam klopot przy formatowaniu waluty - mianowicie nie bieze mi ani UI Culture ani Current Culture.

Dlatego tez musialem napisac converter konwertujacy z wartosci bindowanej do waluty w CurrentUICulture, dopiero wtedy mialem zł.

Gutek
http://blog.gutek.pl
http://dotnetblogs.pl

Jakub Gutkowski pisze...

a jeszcze jedno, a nie sprawdzales przy bindowaniu:

StringFormat=' cos {0} db' ? wtedy IMO powinien zachowac spacje.

Gutek

pawlos pisze...

Co do waluty to Bartek Szafko kiedyś poruszał ten problem. Nieużywanie UICulture jest 'by design' :/ - http://bartekszafko.pl/2009/12/08/wpf-databinding-nie-uzywa-ustawien-narodowych/.

Oczywiście zadziała z 'coś'iem. ja potrzebowałem zacząć StringFormat od spacji.

Pozdrawiam,
Paweł

Jakub Gutkowski pisze...

Hejka,

Tak:
StringFormat=' {0}'

tez Ci zadziala z przodujacymi spacjami. Trzeba zamknac to w ciapki pojedyncze.

dzieki za link.

Gutek

pawlos pisze...

Wydawło mi się, że próbowałem z apostrofami i edytor zgłaszał mi błąd. Będę musiał to sprawdzić wieczorem.

Dzięki.

Anonimowy pisze...

I think that way worked in an older version but doesn't any longer. The solution I see the most is to put a \ before the brackets but you can't have a leading space with the \ method. However, I just found that the following will work;



where the single quotes inside the double quotes delimit the StringFormat value. I'm pretty sure I tried this in the past since it's very javascript-like and it didn't work then but it does now, at least until the next update...